Kivy框架 - 最具Python风格的TextInput/Label更新解决方案?
我最近在用Kivy和Python 3开发,遇到了一个问题。我在一个BoxLayout里放了两个小部件,一个是文本输入框(TextInput),另一个是标签(Label)。当我在文本输入框里输入一些文字并按下回车键时,我希望标签的内容能更新为文本输入框里的文字。
我找到了一个可行的解决方案。以下是代码(问题在下面):
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
我有几个问题:
把标签小部件赋值给一个实例变量算不算坏的编程习惯?从软件工程的角度来看,这样做会不会让人困惑?或者我应该把所有的小部件都赋值给TexttestApp类的实例?(比如 self.text
, self.window
等等)。现在的代码看起来有点杂乱,但我找不到其他解决问题的方法。
谢谢大家。这是我第一次尝试用 bind()
来把一个函数绑定到键盘事件上。
1 个回答
1
这段代码看起来没什么问题。我想从原则上讲,我可以挑一些毛病,但在这么小的代码片段里,真的没什么特别重要的,因为你并没有做错什么。你评论的内容在一般情况下是可以的,而且把东西存储为应用的属性并没有什么规则禁止,虽然可能有更好或更方便的替代方法(见下文)。
从kivy的角度来看,最重要的一点可能就是……使用kv语言!在这种情况下,你可以有一个名为texttest.kv的文件,里面写着:
BoxLayout:
TextInput:
multiline: False
on_text_validate: the_label.text = self.text
Label:
id: the_label
text: "Initial Label"
这将替代你应用类中的两个方法。长度上和你的例子差不多,因为它非常简单,但我觉得它已经稍微清晰一些了——而且随着事情变得更复杂,kv语言会变得更加清晰且不那么冗长,因为它会自动处理很多绑定。
这个例子也避免了绑定你自己的函数来改变标签文本,因为这一切都可以在一行kv中完成,但你这样做并没有错,如果任务更复杂,调用python文件中的方法或函数可能仍然是合适的。