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

Python Kivy:事务中属性/设置属性的延迟更改事件,python,properties,transactions,kivy,Python,Properties,Transactions,Kivy,假设我从按钮继承,添加了一个附加属性: class MyButton(Button): value = ObjectProperty(None) 进一步假设值和按钮的文本属性总是一起更改,比如在一个方法中 def update_data(self, data): self.text = data[0] self.value = data[1] 现在,如果我有一个绑定到文本的回调,它将无法访问新的值。是否有办法延迟触发事件,直到update\u data方法结束(以便合

假设我从
按钮继承,添加了一个附加属性:

class MyButton(Button):
    value = ObjectProperty(None)
进一步假设
和按钮的
文本
属性总是一起更改,比如在一个方法中

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

现在,如果我有一个绑定到
文本的回调
,它将无法访问新的
。是否有办法延迟触发事件,直到
update\u data
方法结束(以便合并对象的状态,如数据库事务)?仅绑定到
值是不可靠的,如果不熟悉实现的人更改了另一个方法中的属性分配顺序,该怎么办?

您的
on\u text
方法可以使用
时钟安排尽快调用另一个方法。安排一次(回调,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()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.button导入按钮
从kivy.uix.boxlayout导入boxlayout
从kivy.properties导入ObjectProperty
从kivy.clock导入时钟
生成器。加载\u字符串(“”)
:
我的按钮:我的按钮
我的按钮
案文:“…”
我的按钮
按钮
文本:“值\文本\顺序”
按:root.value\u text\u order()
按钮
文本:“文本\值\顺序”
按:root.text\u value\u order()
""")
类MyButton(按钮):
值=对象属性(无)
my_button=ObjectProperty()
文本上的定义(自身、实例、值):
时钟调度一次(自启动测试和值,0)
def on_测试_和_值(self,*args):
打印(“文本:{}值:{}”。格式(self.text,self.value))
类MyWidget(BoxLayout):
定义值文本顺序(self,*args):
self.my_button.value='b'
self.my_button.text='a'
def text_value_顺序(self,*args):
self.my_button.text='c'
self.my_button.value='d'
类别MyApp(应用程序):
def生成(自):
返回MyWidget()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()

谢谢,这是一个有趣的方法。我还不打算接受它,因为有几个问题:不能简单地对值上的
执行相同的操作,因为这样会触发两次
self.on\u test\u和值上的
。另一个问题是,最重要的是,原始回调应该能够访问有效数据,而不是添加新回调。最后,这可能是我必须使用的。这可能有助于解决第一个问题: