2016-07-14 80 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不同的东西在主屏幕正确地反弹到新的价值。