从kv lang直接翻译成Python

时间:2016-01-17 08:06:33

标签: python kivy

我试图通过在纯Python中编写等价来理解kv lang。我将kivy lang直接翻译成Python的尝试失败了。这些程序的外观和行为完全不同!

以下是使用kv lang的代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import StringProperty

import random

Builder.load_string( '''
<YourWidget>:
    BoxLayout:
        size: root.size
        Button:
            text: "Change text"
            on_release: root.change_text()
        Label:
            text: root.random_number
''')

class YourWidget(Widget):
    random_number = StringProperty()

    def __init__(self, **kwargs):
        super(YourWidget, self).__init__(**kwargs)
        self.random_number = str(random.randint(1, 100))

    def change_text(self):
        self.random_number = str(random.randint(1, 100))

class YourApp(App):
    def build(self):
        return YourWidget()

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

这是没有kv lang的代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.properties import StringProperty

import random

class YourWidget(Widget):
    random_number = StringProperty('')

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

        # box layout
        box = BoxLayout(size = self.size)
        self.add_widget(box)

        # button widget
        btn = Button(text='Change text', on_release=self.change_text)
        box.add_widget(btn)

        # label widget
        self.random_number = str(random.randint(1, 100))
        lbl = Label(text=self.random_number)
        box.add_widget(lbl)

    def change_text(self, instance):
        self.random_number = str(random.randint(1, 100))

class YourApp(App):
    def build(self):
        return YourWidget()

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

首先,与kv lang程序相比,纯Python程序中的主要窗口小部件(YourWidget)与窗口的大小不同。

其次,每次按下按钮都不会修改标签文本,这与kv lang程序不同。

有人会告诉我什么是正确的翻译&#39;这个节目的kivy lang?

1 个答案:

答案 0 :(得分:1)

box = BoxLayout(size = self.size)

在Python中,访问属性会捕获它们的当前值而不会捕获任何其他值,而kv会自动检测到值是属性,并在更改时创建要更新的绑定。因此,您必须创建自己的绑定。在这种情况下,您可以使用

self.bind(size=box.setter('size'))