2016-02-04 48 views
1

想我從Button繼承,增加一個附加屬性:Kivy:在交易屬性/設置屬性延遲變化事件

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是不可靠的,如果某人不熟悉該實現會以另一種方法更改屬性分配的順序?

回答

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() 
+0

謝謝,這是一個有趣的方法。我還沒有接受它,因爲有幾個問題:一個人不能簡單地對'on_value'做同樣的事情,因爲那樣會觸發'self.on_test_and_value'兩次。另一個問題是,最優雅的是,原始的回調應該有權訪問有效的數據,而不是添加新的回調。但最終,這可能是我必須使用的。 – zeeMonkeez

+0

這可能有助於解決第一個問題:http://stackoverflow.com/questions/31254796/kivy-check-if-a-function-is-already-scheduled – Nykakin