2016-04-05 6 views
1

次のコードを検討してください。 接頭辞が変更された場合、複数のウィジェットインスタンスを更新したいと思います。すべてのインスタンスで同じですから、インスタンスをクラスレベルで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をトリガーするために「クラスレベルプロパティ」プレフィックス変更を取得する方法はありますか?

答えて

1

私はこれを直接行うことはできませんが、AliasPropertyとその機能を模倣することができ、別のプロパティが例えばAppに格納されていると思います。 MyLabelのインスタンスがprefixに変更されていない限り、Appに設定された値が使用されます(自動的に更新されます)。インスタンスにprefixが設定されると、_my_prefixNoneではなく、prefixの値を取得するために使用されます。

変更

<MyLabel>: 
    _prefix: app.prefix 
    text: self.prefix +':'+ self.indice 

そして

class MyLabel(Label): 
    indice = StringProperty('0') 
    _prefix = StringProperty('') 
    _my_prefix = StringProperty(None) 

    def get_prefix(self): 
     if self._my_prefix is None: 
      return self._prefix 
     else: 
      return self._my_prefix 
    def set_prefix(self, value): 
     self._my_prefix = value 

    prefix = AliasProperty(get_prefix, set_prefix, bind=('_prefix', '_my_prefix')) 

[...]

def my_method(self,*args,**kwargs): 
    App.get_running_app().prefix = str(random.randint(0,9)) 
    self.my_label1.indice = str(int(self.my_label1.indice) + 1) 
    if int(self.my_label1.indice) == 2: 
     self.my_label2.prefix = 'changed' 

[...]

class MyApp(App): 
    prefix = StringProperty('1') 
にPythonのコードを変更する <MyLabel>ルール
+0

素敵な、一気に2つのもの! (また、私はかなりドキュメントからそれをキャッチしなかったので、いくつかの点でAliasPropertyを使用する方法を尋ねたかった:)) – simplynail

関連する問題