【问题标题】:Kivy: delay change event for property / set properties in transactionsKivy:延迟更改交易中的属性/设置属性事件
【发布时间】:2016-05-14 09:15:44
【问题描述】:

假设我继承自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是不可靠的,如果不熟悉实现的人在其他方法中更改了属性分配的顺序怎么办?

【问题讨论】:

    标签: python properties transactions kivy


    【解决方案1】:

    您的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()
    

    【讨论】:

    • 谢谢,这是一个有趣的方法。我还不会(还)接受它,因为有几个问题:不能简单地对on_value 做同样的事情,因为那样会触发self.on_test_and_value 两次。另一个问题是,最优雅的是,原始回调应该可以访问有效数据,而不是添加新的回调。最后,这可能是我必须使用的。
    • 这可能有助于解决第一个问题:stackoverflow.com/questions/31254796/…
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2020-04-27
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2015-01-06
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多