BoundedNumericProperty
,实际上任何Property
,都可以在deal with invalid values创建errorhandler
:
class MyCl(EventDispatcher):
# returns the boundary value when exceeded
bnp = BoundedNumericProperty(0, min=-500, max=500,
errorhandler=lambda x: 500 if x > 500 else -500)
我尝试在MyCl
:
def set_err(self, new_err):
self.property('bnp').errorhandler = lambda x: new_err
但令我惊讶的是,我得到了
AttributeError:"' kivy.properties.BoundedNumericProperty'对象没有属性' errorhandler'"
那么,如何在创建属性后更改错误处理程序?
答案 0 :(得分:3)
属性在Cython中实现,他们don't expose在defaultvalue
之外的内部属性。看起来设置此处理程序的唯一方法是通过__init__
方法。我们来做吧。由于__init__
不是一个construcor(__new__
是),而是一个初始值设定项,并且它不会创建一个新实例,we can just call it multiple times:
#!/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()
当然这将删除以前的初始化选项。查看property's __init__
method以查看将要更改的内容。