次のコードを検討してください。 接頭辞が変更された場合、複数のウィジェットインスタンスを更新したいと思います。すべてのインスタンスで同じですから、インスタンスをクラスレベルで1回だけ保存/更新することが効率的です(インスタンスに独自のself.prefixがない場合、自動的にクラスレベルプレフィックス属性を参照します)これは正しいと思われるのpython側からのようkivyは接頭辞が変わってしまったときの認識の問題を持っているようKivy:クラスレベル(インスタンスではない)でイベントをトリガーすることは可能ですか?
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import StringProperty
import random
kivy_lang = '''
<MainWidget>:
Button:
id: my_button
text: 'increase indice'
<MyLabel>:
on_prefix: self.text = self.prefix +':'+ self.indice
on_indice: self.text = self.prefix +':'+ self.indice
'''
class MyLabel(Label):
prefix = StringProperty('1')
indice = StringProperty('0')
pass
class MainWidget(BoxLayout):
def __init__(self, **kwargs):
super(MainWidget, self).__init__(**kwargs)
self.my_label1 = MyLabel()
self.my_label2 = MyLabel()
self.add_widget(self.my_label1)
self.add_widget(self.my_label2)
self.ids.my_button.bind(on_press=self.my_method)
def my_method(self,*args,**kwargs):
MyLabel.prefix = str(random.randint(0,9))
self.my_label1.indice = str(int(self.my_label1.indice) + 1)
# my_label2 would also be updated if its 'indice' got changed as below
# self.my_label2.indice = str(int(self.my_label2.indice) + 2)
class MyApp(App):
def build(self):
Builder.load_string(kivy_lang)
return MainWidget()
if __name__ == '__main__':
MyApp().run()
は、Kivy側からそれが見えます(indiceも更新されたと on_indice がトリガされているのでmy_label1のみ更新されます)。
on_prefixをトリガーするために「クラスレベルプロパティ」プレフィックス変更を取得する方法はありますか?
素敵な、一気に2つのもの! (また、私はかなりドキュメントからそれをキャッチしなかったので、いくつかの点でAliasPropertyを使用する方法を尋ねたかった:)) – simplynail