Kivy框架 - 使用TextInput / Label更新的大多数pythonic解决方案?

时间:2014-07-05 19:03:24

标签: python python-3.x kivy

我一直在与Kivy和Python 3合作,而且我遇到了一个问题。我在BoxLayout中有两个小部件,一个是TextInput小部件,另一个是Label小部件。当一些文本输入到TextInput小部件并按下回车键时,我希望Label.text更新以反映TextInput.text

我已经制定了一个有效的解决方案。这是代码(休息后的问题):

from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class TexttestApp(App):
    def on_enter(self,textin):
        self.lab.text = textin.text #is this incorrect?

    def build(self):
        window = BoxLayout()
        self.lab = Label(text="Inital Label") #is this incorrect?
        text = TextInput(multiline=False)
        text.bind(on_text_validate=self.on_enter)
        window.add_widget(text)
        window.add_widget(self.lab) 
        return window

我的问题如下: 将Label小部件分配给实例变量是一种错误的编程习惯吗?从软件工程的角度来看,这是不是很混乱?或者我应该将所有小部件分配给TexttestApp类的实例吗?(即self.textself.window等)。现在代码对我来说看起来很混乱,但我无法找到解决问题的另一种方法。

提前致谢。这是我第一次尝试使用bind()将函数附加到键盘事件。

1 个答案:

答案 0 :(得分:1)

这一切对我来说都很好。我原则上我认为我可以挑选一些东西,但是在这么小的代码片段里真的没有什么非常重要,因为你没有做任何错误的事情。一般而言,您评论的内容很好,并且没有规定将内容存储为应用的属性,尽管可能有更好或更方便的替代方案(如下所示)。

从kivy的角度来看,最重要的可能是......使用kv语言!在这种情况下,您可以使用

文件texttest.kv
BoxLayout:
    TextInput:
        multiline: False
        on_text_validate: the_label.text = self.text
    Label:
        id: the_label
        text: "Initial Label"

这将替换您的app类的两种方法。它与你的例子非常相似,因为它非常简单,但是我已经说它已经有点清晰了 - 随着事情变得越来越复杂,kv很快变得越来越清晰而且越来越冗长,因为它需要自动处理大量绑定。

这个例子碰巧也避免绑定到你自己的函数来改变标签文本,因为它可以在一行kv中完成,但你的方式没有错,它可能仍然适合调用方法或如果任务更复杂,则在python文件中运行。