Ich habe Probleme mit der Bindung von Eigenschaften über verschiedene Regeln hinweg mit der Sprache kivy.Kivy-Eigenschaften werden nicht automatisch aktualisiert
Insbesondere versuche ich einen Farbwähler zu verwenden, um die Hintergrundfarbe ein paar Etiketten zu ändern; Ich verwende eine ScreenManager
, um zwei verschiedene Screen
s, ein Hauptbildschirm mit nur einer MyButton
Instanz (eine Unterklasse von Label
, wie im Code zu sehen) und ein anderer Bildschirm mit einem ColorPicker
und anderen MyButton
zu behandeln.
Hier ist der Code, den ich arbeiten:
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
Wenn ich eine Farbe auf der ColorPicker
wählen, möchte ich Sie beide Tasten ihren Hintergrund ändern ; aber während die Taste in der PickerScreen
ändert sich bei der Farbauswahl, anscheinend ist die my_rgba
der Schaltfläche im Hauptbildschirm nicht an root.my_picker.color
gebunden, wie ich erwartet hatte.
Ich dachte, das Problem könnte wegen der if-then-else-Ausdruck sein; aber ich habe versucht, die ObjectProperty
in MyScreen
mit einem Dummy-Wert zu initialisieren, entfernen Sie den if-then-else-Ausdruck, und das Verhalten scheint identisch.
Was mache ich falsch? Ich beginne gerade mit Kivy, aber ich dachte, dass Eigenschaften automatisch gebunden wurden, so dass, wenn root.my_picker.color
geändert werden, so sollten beide die Schaltflächen my_rgba
Eigenschaften.
Am Ende haben Sie 'MainScren.picker = picker_screen.picker' gesetzt, wollten Sie' MainScreen.my_picker = picker_screen.picker' nicht einstellen? – syntonym
@syntonym Du hast recht; Es gab wenige andere Linien, wo ich den gleichen Fehler machte. Ich korrigierte sie, aber nichts änderte sich; was zu erwarten ist, wenn man bedenkt, dass "root.my_picker" zunächst "None" ist, also "my_rgba" an die Konstante '(.5, .5, .5, 1)' gebunden ist und ist nie aktualisiert – Odexios
Was passiert, wenn Sie 'ObjectProperty (Rebind = True)' für den my_picker setzen? [Relevante Dokumentation] (https://kivy.org/docs/api-kivy.properties.html#kivy.properties.ObjectProperty) – syntonym