Python: Как получить обновленный текст ввода для использования в команде, связанной с ней?
-
28-09-2019 - |
Вопрос
Рассмотрим следующий код:
text = Entry(); text.pack()
def show(e):
print text.get()
text.bind('<Key>', show)
Допустим, я положил буквы ABC в запись, один за другим. Вывод будет:
>>>
>>> A
>>> AB
Обратите внимание, что при нажатии A, он печатает пустую строку. Когда я нажимаю B, он печатает A, а не AB. Если я не нажимаю ничего после C, он никогда не будет показан. Похоже, что контент ввода обновляется только после возврата Binded Command, поэтому я не могу использовать фактическое значение записи в этой функции.
Есть ли способ получить обновленное значение ввода, чтобы использовать внутри обязательной команды?
Решение
Вы можете заменить <Key>
событие с <KeyRelease>
мероприятие. Это должно работать.
Вот список событий: http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types.
Другие советы
Причина этого связана с TK «BindTags». Привязки связаны с тегами, и привязки обрабатываются в порядке метки. Имена виджетов и классы виджетов - это теги, и они обрабатываются в этом порядке (первое привязки, специфичные виджеты, привязки классов вторым).
По этой причине в любое время вы нажимаете ключ, ваш виджет, специфический привязку, будет огонь до того, как привязка класса имеет шанс изменить виджет.
Есть много обходных путей. Самый простой состоит в том, чтобы связать с <KeyRelease>
Поскольку привязки классов случаются на клавише. Существуют иные решения, которые включают в себя либо добавлять, либо переставляющие теги привязки, либо используют встроенные функции проверки данных входного виджета. Что лучше всего, зависит от того, что вы действительно пытаетесь достичь.
Для получения дополнительной информации о функциях проверки данных см. В этом вопросе: Интерактивно подтверждающий контент въезда в Tkinter
Для более полного ответа см. Tkinter: установите Stringvar послеu003CKey> событие, включая нажатый ключ