2016-07-14 12 views
0

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.

+1

Am Ende haben Sie 'MainScren.picker = picker_screen.picker' gesetzt, wollten Sie' MainScreen.my_picker = picker_screen.picker' nicht einstellen? – syntonym

+0

@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

+1

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

Antwort

0

Das Problem wird einfach durch Änderung der my_picker Eigenschaft in MyScreen auf diese Weise gelöst:

class MyScreen(Screen): 
    my_picker = ObjectProperty(rebind=True) 

Als Folge, wenn root.my_picker auf etwas anderen None gesetzt ist, my_rgba in der MyButton Instanz im Hauptbildschirm wird korrekt auf den neuen Wert zurückgesetzt.