我在使用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
属性。
最后你设置'MainScren.picker = picker_screen.picker'你不想设置'MainScreen.my_picker = picker_screen.picker'? – syntonym
@syntonym你是对的;还有其他几行我犯了同样的错误。我纠正了他们,但没有任何改变;这似乎是预料之中的,考虑到我认为问题在于'root.my_picker'一开始是'None',所以'my_rgba'被绑定到常量'(.5,.5,.5,1)',并且是从未更新 – Odexios
如果为my_picker设置“ObjectProperty(rebind = True)”,会发生什么情况? [相关文档](https://kivy.org/docs/api-kivy.properties.html#kivy.properties.ObjectProperty) – syntonym