Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python BoundedNumericProperty:在运行时设置errorhandler_Python_Kivy - Fatal编程技术网

Python BoundedNumericProperty:在运行时设置errorhandler

Python BoundedNumericProperty:在运行时设置errorhandler,python,kivy,Python,Kivy,BoundedNumericProperty,实际上任何属性,在创建时都可以有一个errorhandler,用于: 我试图在运行时用MyCl的方法更改errorhandler属性: def set_err(self, new_err): self.property('bnp').errorhandler = lambda x: new_err 但令我惊讶的是,我 AttributeError:“'kivy.properties.BoundedNumericProperty'对象没有属性

BoundedNumericProperty
,实际上任何
属性
,在创建时都可以有一个
errorhandler
,用于:

我试图在运行时用
MyCl
的方法更改errorhandler属性:

def set_err(self, new_err):
    self.property('bnp').errorhandler = lambda x: new_err
但令我惊讶的是,我

AttributeError:“'kivy.properties.BoundedNumericProperty'对象没有属性'errorhandler'”


那么,在创建属性后如何更改errorhandler

属性在Cython中实现,它们的内部属性在
defaultvalue
之外。看起来设置此处理程序的唯一方法是通过
\uuuu init\uuuu
方法。让我们做吧。由于
\uuuu init\uuuu
不是构造函数(
\uuuu new\uuuuu
是),而是初始值设定项,并且它不会创建新实例,因此:

#/usr/bin/kivy
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
从kivy.properties导入NumericProperty
从kivy.properties导入BoundedNumericProperty
Builder.load_字符串(“”)
:
按钮:
文本:“设置错误处理程序”
按:root.set\u error\u handler()
按钮:
文本:“测试”
按:root.bnp=10000
''')
类MyWidget(BoxLayout):
bnp=BoundedNumericProperty(0,最小值=-500,最大值=500)
def错误\u处理程序(自身,*args):
打印(“错误处理程序”)
返回0
def设置错误处理程序(自身):
#我们需要添加默认值作为第一个参数
self.property('bnp')。\uuuuu init\uuuuu0,errorhandler=self.error\u handler)
类主应用程序(应用程序):
def生成(自):
返回MyWidget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MainApp().run()

当然,这将删除以前的初始化选项。查看将要更改的内容。

属性是在Cython中实现的,它们的内部属性不在
defaultvalue
范围内。看起来设置此处理程序的唯一方法是通过
\uuuu init\uuuu
方法。让我们做吧。由于
\uuuu init\uuuu
不是构造函数(
\uuuu new\uuuuu
是),而是初始值设定项,并且它不会创建新实例,因此:

#/usr/bin/kivy
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
从kivy.properties导入NumericProperty
从kivy.properties导入BoundedNumericProperty
Builder.load_字符串(“”)
:
按钮:
文本:“设置错误处理程序”
按:root.set\u error\u handler()
按钮:
文本:“测试”
按:root.bnp=10000
''')
类MyWidget(BoxLayout):
bnp=BoundedNumericProperty(0,最小值=-500,最大值=500)
def错误\u处理程序(自身,*args):
打印(“错误处理程序”)
返回0
def设置错误处理程序(自身):
#我们需要添加默认值作为第一个参数
self.property('bnp')。\uuuuu init\uuuuu0,errorhandler=self.error\u handler)
类主应用程序(应用程序):
def生成(自):
返回MyWidget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MainApp().run()

当然,这将删除以前的初始化选项。看看会发生什么变化。

@wolfsgang
value
是个错误;我把它改成了bnp
self.property('bnp')
返回
BoundedNumericProperty
。事实上,事实证明属性不能像这样访问,但我不明白为什么,或者如何访问。FWIW,我遇到了哪种类型的属性做了类似的事情。我想目前没有办法避免errorhandler不处理单个对象的最小/最大值这一事实settings@wolfsgang
是一个错误;我把它改成了bnp
self.property('bnp')
返回
BoundedNumericProperty
。事实上,事实证明属性不能像这样访问,但我不明白为什么,或者如何访问。FWIW,我遇到了哪种类型的属性做了类似的事情。我想目前还没有办法绕过errorhandler不处理单个对象的最小/最大设置这一事实。谢谢你的回答。它确实有效,但它实际上只是显示了kivy中当前实现的
BoundedNumericProperty
的(IMHO)缺陷。能够在每个实例的基础上更改最小值/最大值而不能够在每个实例的基础上进行错误处理是没有意义的(我知道通过重新定义
边界
,可以解决这个问题,但这本身就有问题)。当然,对于像
StringProperty
这样的东西,这并不重要(除非对什么是字符串有不同的看法)。谢谢你的回答。它确实有效,但它实际上只是显示了kivy中当前实现的
BoundedNumericProperty
的(IMHO)缺陷。能够在每个实例的基础上更改最小值/最大值而不能够在每个实例的基础上进行错误处理是没有意义的(我知道通过重新定义
边界
,可以解决这个问题,但这本身就有问题)。当然,对于像
StringProperty
这样的东西,这并不重要(除非对什么是字符串有不同的看法)。
def set_err(self, new_err):
    self.property('bnp').errorhandler = lambda x: new_err
#!/usr/bin/kivy

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty
from kivy.properties import BoundedNumericProperty

Builder.load_string('''
<MyWidget>:
    Button:
        text: "Set error handler"
        on_press: root.set_error_handler()
    Button:
        text: "Test"
        on_press: root.bnp = 10000
''')

class MyWidget(BoxLayout):
    bnp = BoundedNumericProperty(0, min=-500, max=500)

    def error_handler(self, *args):
        print("error_handler")
        return 0   

    def set_error_handler(self):
        # we need to add default value as the first argument
        self.property('bnp').__init__(0, errorhandler=self.error_handler)

class MainApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MainApp().run()