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
是个错误;我把它改成了bnpself.property('bnp')
返回BoundedNumericProperty
。事实上,事实证明属性不能像这样访问,但我不明白为什么,或者如何访问。FWIW,我遇到了哪种类型的属性做了类似的事情。我想目前没有办法避免errorhandler不处理单个对象的最小/最大值这一事实settings@wolfsgang值
是一个错误;我把它改成了bnpself.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()