【问题标题】:Direct translation from kv lang to Python从 kv lang 到 Python 的直接翻译
【发布时间】:2016-01-17 08:06:32
【问题描述】:

我试图通过用纯 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 程序不同,每当我按下按钮时,标签文本都不会被修改。

有人能告诉我这个程序的 kivy lang 的正确“翻译”是什么吗?

【问题讨论】:

  • 源到源交叉编译器,它直接将一种语言的源代码翻译成另一种语言的源代码,可能会有所帮助。这是一篇关于它们的维基百科文章(也将它们描述为转编译器或转译器):en.wikipedia.org/wiki/Source-to-source_compiler - 这是其中许多的维基百科列表:en.wikipedia.org/wiki/…。 . .其中列出了一些 python 交叉编译器;我不知道他们中的任何一个是否会转换 kivy。

标签: python kivy


【解决方案1】:
box = BoxLayout(size = self.size)

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

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

【讨论】:

  • 谢谢。我已将其添加到我的代码中:self.bind(random_number=lbl.setter('text'))。现在它的行为与 kv lang 程序完全一样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2018-09-16
  • 2019-10-07
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多