理解Kivy的特性和约束方法

时间:2016-03-07 00:40:54

标签: python properties bind kivy

我在理解自定义Properities的使用以及将方法绑定到事件的方法时遇到了问题。 这是我的代码:

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 lang中的Button绑定方法(并在python端删除整个' init ()'):

on_press: root.my_method

然后当我按下按钮时,应用程序不会崩溃但没有任何反应

有人可以解释一下如何调整此代码才能工作吗? 我理解代码是一些'混合技术',但我这样做是为了了解不同的方法,所以如果你不把它全部转过来我会很感激:)

1 个答案:

答案 0 :(得分:1)

1 /你缺少自我&#39;之前&#39; my_property&#39; in&#39; on_my_property&#39; bindind,因此崩溃

2 /在kv绑定中。 python代码被调用为write,因此你需要&#39;()&#39;在&#39; root.my_method&#39;之后,或该声明无效。