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式が原因で問題が発生する可能性があると考えました。しかし、MyScreen
のObjectProperty
をダミーの値で初期化して、if-then-else式を削除してみたところ、動作は同じように見えました。
私は間違っていますか?私はちょうどKivyから始まっていますが、プロパティが自動的にバインドされていると思って、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