2016-07-14 125 views
0

我在使用kivy語言跨不同規則綁定屬性時遇到問題。Kivy屬性不會自動更新

特別是,我試圖用顏色選擇器來改變背景顏色幾個標籤;我正在使用ScreenManager來處理兩個不同的Screen s,一個主屏幕只有一個MyButton實例(Label的子類,如代碼中所示),另一個屏幕帶有ColorPicker和另一個屏幕MyButton

這裏是我工作的代碼:

picker.py

from kivy.app import App 
from kivy.properties import BoundedNumericProperty, ReferenceListProperty, \ 
    ObjectProperty 
from kivy.uix.behaviors.button import ButtonBehavior 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import Screen 


class MyScreen(Screen): 
    my_picker = ObjectProperty(None) 

class MyButton(ButtonBehavior, Label): 
    my_r = BoundedNumericProperty(1, min=0, max=1) 
    my_g = BoundedNumericProperty(1, min=0, max=1) 
    my_b = BoundedNumericProperty(1, min=0, max=1) 
    my_a = BoundedNumericProperty(1, min=0, max=1) 
    my_rgba = ReferenceListProperty(my_r, my_g, my_b, my_a) 

class PickerApp(App): 
    pass 


def main(): 
    PickerApp().run() 

if __name__ == '__main__': 
    main() 

picker.kv

<[email protected]>: 
    color: 0, 0, 0, 1 
    canvas.before: 
     Color: 
      rgba: self.my_rgba 
     Rectangle: 
      pos: self.pos 
      size: self.size 

<[email protected]>: 
    my_picker: picker 
    BoxLayout: 
     orientation: 'vertical' 
     MyButton: 
      my_rgba: picker.color 
      text: "Back" 
      size_hint: 1, .2 
      on_press: 
       root.manager.current = 'main' 
     ColorPicker: 
      id: picker 

<[email protected]>: 
    MyButton: 
     my_rgba: root.my_picker.color if root.my_picker is not None else .5, .5, .5, 1 
     text: "Picker" 
     on_press: 
      root.manager.current = 'picker' 

ScreenManager: 
    MainScreen: 
     name: 'main' 
     my_picker: picker_screen.my_picker 
    PickerScreen: 
     name: 'picker' 
     id: picker_screen 

當我選擇在ColorPicker一種顏色,我希望兩個按鈕來改變他們的背景;但當PickerScreen中的按鈕在顏色選擇上發生變化時,主屏幕中按鈕的my_rgba顯然不會與root.my_picker.color一致,如我所料。

我認爲這個問題可能是因爲if-then-else表達式;但我嘗試使用虛擬值初始化ObjectProperty,MyScreen,刪除if-then-else表達式,並且行爲似乎相同。

我在做什麼錯?我剛剛開始與基維,但我認爲,屬性被自動綁定,所以如果root.my_picker.color改變,所以應該按鈕my_rgba屬性。

+1

最後你設置'MainScren.picker = picker_screen.picker'你不想設置'MainScreen.my_picker = picker_screen.picker'? – syntonym

+0

@syntonym你是對的;還有其他幾行我犯了同樣的錯誤。我糾正了他們,但沒有任何改變;這似乎是預料之中的,考慮到我認爲問題在於'root.my_picker'一開始是'None',所以'my_rgba'被綁定到常量'(.5,.5,.5,1)',並且是從未更新 – Odexios

+1

如果爲my_picker設置「ObjectProperty(rebind = True)」,會發生什麼情況? [相關文檔](https://kivy.org/docs/api-kivy.properties.html#kivy.properties.ObjectProperty) – syntonym

回答

0

這個問題可以簡單地通過這種方式改變MyScreenmy_picker物業解決:

class MyScreen(Screen): 
    my_picker = ObjectProperty(rebind=True) 

因此,當​​設置在MyButton例如,從Nonemy_rgba不同的東西在主屏幕正確地反彈到新的價值。