Kivy Text Input Widget:对“ bind”属性感到困惑

时间:2019-03-12 08:46:12

标签: python oop kivy

我是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个参数?

1 个答案:

答案 0 :(得分:1)

Bind将事件与函数联系起来。

在您的情况下,第一个事件是on_text_validate小部件的TextInput(当您在其文本字段上按Enter时发出的事件),第二个事件是{{1} }(更改字段文本时)。

这些事件使用不同的参数触发其专用功能。
它们都将产生它们的小部件(text实例)作为第一个参数发送。
TextInput还会发送更改后的文本。

要获取text事件的文本,您可以像这样获取on_text_validate TextInput属性: text