我是Kivy的新手。我正在编写此代码,并且对bind函数的作用感到困惑。
基本上,下面的代码生成文本输入并打印出用户输入。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
class LoginScreen(Widget):
def __init__(self, **kwargs):
super(LoginScreen, self).__init__(**kwargs)
self.username = TextInput(size = (300, 30), pos = (300, 30), multiline = False)
# self.username.bind(on_text_validate = self.on_enter) ### first line
self.username.bind(text= self.on_text) ### second line
self.add_widget(self.username)
def on_enter(instance, value, secondvalue):
print(secondvalue)
def on_text(instance, value, secondvalue):
print(secondvalue)
class ABCApp(App):
def build(self):
return LoginScreen()
if __name__ == "__main__":
ABCApp().run()
这就是我感到困惑的地方。为什么只有打印出secondvalue
才能得到用户的实际输入? bind
函数在这里做什么?我查看了文档,但找不到任何东西。
另外,如果我切换注释,以使第一行被注释掉,第二行被注释掉,例如
self.username.bind(on_text_validate = self.on_enter) ### first line
# self.username.bind(text= self.on_text) ### second line
我现在在输入文本并按下Enter键时引用函数on_enter
。但是,然后我收到错误消息:
TypeError: on_enter() missing 1 required positional argument: 'secondvalue'
如果我将函数on_enter
更改为接受2个参数,则
def on_enter(instance, secondvalue):
print(secondvalue)
现在可以打印<kivy.uix.textinput.TextInput object at 0x0000000003A432B8>
,但不会恢复文本。
我对Kivy在他们的后端所做的事情感到困惑,并且在他们的文档中找不到任何答案。为什么on_enter
接受2个参数而on_text
接受3个参数?
答案 0 :(得分:1)
Bind将事件与函数联系起来。
在您的情况下,第一个事件是on_text_validate
小部件的TextInput
(当您在其文本字段上按Enter时发出的事件),第二个事件是{{1} }(更改字段文本时)。
这些事件使用不同的参数触发其专用功能。
它们都将产生它们的小部件(text
实例)作为第一个参数发送。
TextInput
还会发送更改后的文本。
要获取text
事件的文本,您可以像这样获取on_text_validate
TextInput
属性:
text