Python: Как получить обновленный текст Entry для использования в привязанной к нему команде? - PullRequest
1 голос
/ 26 ноября 2010

Рассмотрим следующий код:

text = Entry(); text.pack()
def show(e):
    print text.get()
text.bind('<Key>', show)

Допустим, я положил буквы ABC в Entry, одну за другой. Вывод будет:

>>> 
>>> A
>>> AB

Обратите внимание, что при нажатии A печатается пустая строка. Когда я нажимаю B, печатается A, а не AB. Если я не нажму ничего после C, это никогда не будет показано. Кажется, что содержимое Entry обновляется только после того, как команда binded вернулась, поэтому я не могу использовать фактическое значение Entry в этой функции.

Есть ли способ получить обновленное значение Entry для использования внутри связанной команды?

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

Вы можете заменить событие <Key> на событие <KeyRelease>.Это должно работать.

Вот список событий: http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types

2 голосов
/ 26 ноября 2010

Причина этого связана с Tk "bindtags".Привязки связаны с тегами, а привязки обрабатываются в порядке тегов.Имена виджетов, и классы виджетов являются тегами, и они обрабатываются в указанном порядке (сначала привязки виджета, затем привязки класса).

По этой причине при каждом нажатии клавиши срабатывает привязка, специфичная для виджетаперед привязкой класса есть шанс изменить виджет.

Есть много обходных путей.Самым простым является привязка к <KeyRelease>, поскольку привязки классов происходят при нажатии клавиши.Существуют и другие решения, которые включают добавление или изменение порядка привязки тегов или использование встроенных функций проверки данных в виджете ввода.Что лучше, зависит от того, чего вы действительно пытаетесь достичь.

Для получения дополнительной информации о функциях проверки данных см. Этот вопрос: Интерактивная проверка содержимого виджета ввода в tkinter

Более подробный ответ см. Tkinter:установить StringVar после события , включая нажатие клавиши

...