我在使用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
属性也应该改变。
答案 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
会正确反弹到新值。