2016-07-14 26 views
0

kivy言語を使用して異なるルール間でプロパティをバインドする際に問題があります。Kivyプロパティが自動的に更新されない

特に、色のピッカーを使用して、背景色をいくつかのラベルに変更しようとしています。私はインスタンス(コードで見ることができるLabelのサブクラス)とColorPickerと別のMyButtonの別の画面を持つ2つの異なるScreenを扱うために、ScreenManagerを使用しています。

ここで私が働いているコードです:

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式が原因で問題が発生する可能性があると考えました。しかし、MyScreenObjectPropertyをダミーの値で初期化して、if-then-else式を削除してみたところ、動作は同じように見えました。

私は間違っていますか?私はちょうどKivyから始まっていますが、プロパティが自動的にバインドされていると思って、root.my_picker.colorが変更された場合は、両方のボタンも変更する必要があります。my_rgbaプロパティ。

+1

最後に 'MainScren.picker = picker_screen.picker'を設定しましたが、' MainScreen.my_picker = picker_screen.picker'を設定しませんでしたか? – syntonym

+0

@syntonymあなたが正しいです。同じミスを犯した行はほとんどありませんでした。私はそれらを修正しましたが、何も変わりませんでした最初は 'root.my_picker'が' None'であると考えて、 'my_rgba'は定数'(.5、.5、.5、1) 'にバインドされ、決して更新されない – Odexios

+1

my_pickerに 'ObjectProperty(rebind = True)'を設定するとどうなりますか? [関連ドキュメント](https://kivy.org/docs/api-kivy.properties.html#kivy.properties.ObjectProperty) – syntonym

答えて

0

問題は、単にこのようにMyScreenmy_pickerプロパティを変更することで解決される。結果として

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

、​​は、メイン画面にMyButtonインスタンス内Nonemy_rgbaは異なるものに設定されています新しい値に正しくリバウンドします。

関連する問題