2016-04-05 12 views
1

Aşağıdaki kodu göz önünde bulundurun. Birden çok widget örneğini, öneki değiştiğinde güncellemek istiyorum. Tüm örnekler için aynı olduğu için, yalnızca sınıf düzeyinde bir kez saklamak/güncellemek için verimli görünüyor (örneğin, kendi self.prefix'a sahip olmadığında, otomatik olarak öneki özniteliğine başvurulacaktır) Bu doğru görünüyor piton taraftan itibariyle kivy önek değişti aldığımda tanıyan sorunu var gibiKivy: Sınıf seviyesindeki (örnek) Özellikler ile olayları tetiklemek mümkün mü?

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 taraftan görünüyor (Endeks da güncellendi ve on_indice tetiklenir çünkü my_label1 sadece güncellenir).

on_prefix tetiklemek için 'sınıf düzeyini Mülkiyet' önek değişiklik almanın bir yolu var mı?

cevap

1

Bunun doğrudan mümkün olduğunu düşünmüyorum, ancak AliasProperty ile bu işlevselliği ve App numaralı dosyada saklanan başka bir özelliği taklit edebilirsiniz. MyLabel örneği prefix değiştirmediği sürece, App için ayarlanan değer kullanılır (ve otomatik olarak güncelleştirilir). Bir örnekte prefix ayarlandığında, _my_prefixNone değildir ve prefix değerini almak için kullanılır.

[...]

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

için <MyLabel> kuralı değiştirin Ve

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')) 

için piton kodunu değiştirmek

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') 
Bir seferde
+0

güzel, 2 şey! (Ayrıca, AliasProperty'nin nasıl bir şekilde dokümanlardan yakalanmadığı gibi bir noktada nasıl kullanılacağını sormak istedim) :) – simplynail

İlgili konular