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