Kivy Text Input Widget: запутался в атрибуте 'bind' - PullRequest
0 голосов
/ 12 марта 2019

Я новичок в Киви. Я работаю над этим кодом, и меня смущает, что делает функция 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

Теперь я ссылаюсь на функцию 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>, но текст не восстанавливается.

Я запутался в том, что делает Киви на их сервере, и я не могу найти никаких ответов в их документации. Почему on_enter принимает 2 аргумента, а on_text 3?

1 Ответ

1 голос
/ 12 марта 2019

Bind связывает событие с функцией.

В вашем случае первое событие - это on_text_validate виджета TextInput (событие, которое генерируется при нажатии клавиши Enter в его текстовом поле), а второе - text (когда текст поле изменено).

Эти события запускают свои выделенные функции, используя разные аргументы.
Они оба отправляют в качестве первого аргумента виджет, который их производит (экземпляр TextInput).
text также отправляет измененный текст.

Чтобы получить текст события on_text_validate, вы можете получить свойство TextInput text следующим образом: print(instance.text)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...