我一直在与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.text
,self.window
等)。现在代码对我来说看起来很混乱,但我无法找到解决问题的另一种方法。
提前致谢。这是我第一次尝试使用bind()
将函数附加到键盘事件。
答案 0 :(得分:1)
这一切对我来说都很好。我原则上我认为我可以挑选一些东西,但是在这么小的代码片段里真的没有什么非常重要,因为你没有做任何错误的事情。一般而言,您评论的内容很好,并且没有规定将内容存储为应用的属性,尽管可能有更好或更方便的替代方案(如下所示)。
从kivy的角度来看,最重要的可能是......使用kv语言!在这种情况下,您可以使用
文件texttest.kvBoxLayout:
TextInput:
multiline: False
on_text_validate: the_label.text = self.text
Label:
id: the_label
text: "Initial Label"
这将替换您的app类的两种方法。它与你的例子非常相似,因为它非常简单,但是我已经说它已经有点清晰了 - 随着事情变得越来越复杂,kv很快变得越来越清晰而且越来越冗长,因为它需要自动处理大量绑定。
这个例子碰巧也避免绑定到你自己的函数来改变标签文本,因为它可以在一行kv中完成,但你的方式没有错,它可能仍然适合调用方法或如果任务更复杂,则在python文件中运行。