BoundedNumericProperty:在运行时设置errorhandler

时间:2016-02-20 20:19:00

标签: python kivy

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

的方法中在运行时更改errorhandler属性
def set_err(self, new_err):
    self.property('bnp').errorhandler = lambda x: new_err

但令我惊讶的是,我得到了

  

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

那么,如何在创建属性后更改错误处理程序?

1 个答案:

答案 0 :(得分:3)

属性在Cython中实现,他们don't exposedefaultvalue之外的内部属性。看起来设置此处理程序的唯一方法是通过__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以查看将要更改的内容。