Kivy:延迟属性更改事件/设置事务中的属性



>假设我从Button继承,添加一个额外的属性:

class MyButton(Button):
    value = ObjectProperty(None)

进一步假设value和按钮的text属性总是一起更改,例如在方法中

def update_data(self, data):
    self.text = data[0]
    self.value = data[1]

现在,如果我有一个绑定到text的回调,它将无法访问新的value。有没有办法将触发事件延迟到update_data方法结束(以便对象的状态被合并,就像数据库事务一样)?仅仅绑定到value是不可靠的,如果不熟悉实现的人在另一种方法中更改了属性分配的顺序怎么办?

您的on_text方法可以使用Clock.schedule_once(callback, 0)安排要尽快调用另一个方法。举个例子:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.clock import Clock
Builder.load_string("""
<MyWidget>:
    my_button: my_button
    MyButton
        text: "..."
        id: my_button
    Button
        text: "value_text_order"
        on_press: root.value_text_order()
    Button
        text: "text_value_order"
        on_press: root.text_value_order()
""")
class MyButton(Button):
    value = ObjectProperty(None)
    my_button = ObjectProperty()
    def on_text(self, instance, value):
        Clock.schedule_once(self.on_test_and_value, 0)
    def on_test_and_value(self, *args):
        print("text:{} value: {}".format(self.text, self.value))
class MyWidget(BoxLayout):
    def value_text_order(self, *args):
        self.my_button.value = 'b'
        self.my_button.text = 'a'
    def text_value_order(self, *args):
        self.my_button.text = 'c'
        self.my_button.value = 'd'
class MyApp(App):
    def build(self):
        return MyWidget()
if __name__ == '__main__':
    MyApp().run()

最新更新