2016-03-07 62 views
0

我在理解自定義特性的用法以及將事件綁定方法的方法時遇到了問題。 這裏是我的代碼:瞭解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 

kivy_lang = ''' 
<MainWidget>: 
    on_my_property: my_label.text = 'from button bind method via StringProperty' + my_property 

    Label: 
     id: my_label 
     text: root.my_property 
    Button: 
     id: my_button 
     text: 'intro button' 

''' 


class MainWidget(BoxLayout): 
    # bind some properties 
    my_property = StringProperty('0') 

    def __init__(self, **kwargs): 
     super(MainWidget, self).__init__(**kwargs) 
    #  if needed to do sth on widget construction 
     self.ids.my_button.bind(on_press=self.my_method) 


    def my_method(self,*args,**kwargs): 
     self.my_property = str(int(self.my_property)+1) 
     self.ids.my_button.text = 'new' 


class MyApp(App): 
    def build(self): 
     Builder.load_string(kivy_lang) 
     return MainWidget() 

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

當我運行它,它呈現OK,但是當我點擊一個按鈕,結果我得到 NameError:名字「my_property」沒有定義

我想結合的方法對於巴頓在KV與郎(和刪除在Python端整體「初始化()」):

on_press: root.my_method 

,然後當我按下按鈕的應用程序不會崩潰,但什麼也沒有發生

有人可以解釋我如何調整此代碼的工作? 我明白代碼有點「混合技術」,但我這樣做是爲了瞭解不同的方法,所以我將不勝感激,如果你不把它全部圍繞:)

回答

1

1 /你失蹤' self''之前'my_property'在'on_my_property'bindind,因此崩潰

2/in kv綁定。 python代碼被稱爲書面的,所以你需要'()'在'root.my_method'之後,否則這個語句沒有任何作用。

+1

不錯,感謝您的快速回復 - 看起來我畢竟不是那麼遠:) 所以我需要記住: 1)&2) - 在kv lang中':'之後寫什麼不是真的是一個綁定在任何點, **它總是一個python代碼執行'原樣'**當屬性更新(因此'自我。'是需要引用屬性/屬性當前實例的小部件) – simplynail