Kivy属性不会自动更新

时间:2016-07-14 10:48:59

标签: kivy python-3.5

我在使用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

<MyButton@Label>:
    color: 0, 0, 0, 1
    canvas.before:
        Color:
            rgba: self.my_rgba
        Rectangle:
            pos: self.pos
            size: self.size

<PickerScreen@MyScreen>:
    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

<MainScreen@MyScreen>:
    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表达式,行为似乎相同。

我做错了什么?我刚开始使用Kivy,但我认为属性是自动绑定的,所以如果root.my_picker.color发生了变化,那么按钮my_rgba属性也应该改变。

1 个答案:

答案 0 :(得分:0)

只需通过以下方式更改modelList.GroupBy(model => model.GroupId, g => g.Id).Select(item => item.Max())中的my_picker属性即可解决此问题:

MyScreen

因此,当class MyScreen(Screen): my_picker = ObjectProperty(rebind=True) 设置为与root.my_picker不同的内容时,主屏幕中None实例中的my_rgba会正确反弹到新值。