2014-05-22 5 views
0

3 가지 클래스가 있다고 가정 해 봅시다. 물건이 들어있는 "워킹 클래스", 라벨 클래스 및 라벨을 포함하는 클래스입니다. 예를 들어 레이블 클래스는 작업 클래스에서 진행되는 작업의 상태를 나타내는 상태 표시 줄 일 수 있습니다. 이 값은 후자의 내부에서 변경되는 작업 클래스의 값이기 때문에 레이블에 표시 할 값을 자체 업데이트 할 수있는 방법을 찾을 수 있기를 바랍니다. 여기Kivy : 자체 업데이트 라벨 텍스트

나는 속성 또는 무엇 이건 그것을하는 방법이 있나요 예제 코드

Builder.load_string(''' 
<CustomLabel> 
    text: 'Value is {}'.format(root.value) 

<WorkingClass>: 
    orientation: 'vertical' 

    Button: 
     text: 'Update' 
     on_release: root.update() 

<MainLayout> 
    orientation: 'vertical' 

''') 

class CustomLabel(Label): 
    value = NumericProperty() 

class WorkingClass(BoxLayout): 

    def __init__(self, *args, **kwargs): 

     super(WorkingClass, self).__init__(*args, **kwargs) 

     self.a = 5 

    def update(self): 
     self.a += 1 
     print(self.a) 

class MainLayout(BoxLayout): 

    def __init__(self, *args, **kwargs): 

     super(MainLayout, self).__init__(*args, **kwargs) 

     self.workingClass = WorkingClass() 
     self.customLabel = CustomLabel(value=self.workingClass.a) 

     self.add_widget(self.customLabel) 
     self.add_widget(self.workingClass) 





class MyApp(App): 
    def build(self): 
     return MainLayout() 

if __name__ == "__main__": 
    MyApp().run() 

있나요? Becouse 나는 값을 변경할 때마다 레이블을 수동으로 업데이트 (sommehow)하고 싶지 않습니다. 어쨌든 이것을 달성하기 위해서?

답변

2

에서 속성을 업데이트하고 있는데 에서 값을 업데이트하지 않습니다. bind 대신 직접 할당했기 때문에 값을 업데이트하지 않습니다. 하지만 예, Property을 사용하면 모든 것이 자동으로 작동합니다. WorkingClass에서

:

class WorkingClass(BoxLayout): 
    a = NumericProperty() 

    def __init__(self, **kwargs): ... 

이것은 당신이 결합 할 수있는 Propertya한다. 그런 다음

MainLayout의 생성자 :

self.workingClass = WorkingClass() 
self.customLabel = CustomLabel(value=self.workingClass.a) 
self.workingClass.bind(a=self.customLabel.setter('value')) 

마지막 선은 말한다 : 또는

"self.workingClass 변경에 재산 a의 값은 같은 값으로 self.customLabelvalue 속성을 설정할 때" 그냥 Property을 위의 WorkingClass에 추가 한 다음 MainLayout의 생성자를 제거하고 대신 kv를 사용하면됩니다.

<MainLayout>: 
    orientation: 'vertical' 

    WorkingClass: 
     id: working_class 

    CustomLabel: 
     value: working_class.a # assigning one property to another in kv automatically binds 
+0

대단히 감사합니다. 나는 세터에 대해 몰랐어! 난 항상 네가 내 kivy 질문에 대답하는 것을 알아 차렸다. – UfoRobot