Tkinter, виджет ввода, обнаруживает входной текст?

У меня есть виджет Entry на простом калькуляторе. Пользователь может выбрать ввод уравнения через клавиатуру. Мне было интересно, есть ли способ обнаружить персонажа (с клавиатуры в моем случае), который вводится в виджет Entry. Итак, сосредоточиться на виджетах, пользователь нажимает «4», он появляется на виджетах … Могу ли я обнаружить этот акт для основных целей регистрации ввода?

2 Solutions collect form web for “Tkinter, виджет ввода, обнаруживает входной текст?”

Каждый раз, когда вы нажимаете клавишу внутри окна Tkinter, Tkinter.Event экземпляр Tkinter.Event . Все, что вам нужно сделать, это получить доступ к этому экземпляру. Вот простой скрипт, который демонстрирует, как:

 from Tkinter import Tk, Entry root = Tk() def click(key): # print the key that was pressed print key.char entry = Entry() entry.grid() # Bind entry to any keypress entry.bind("<Key>", click) root.mainloop() 

key (являющийся экземпляром Tkinter.Event ) содержит множество различных атрибутов, которые можно использовать для получения практически любого типа данных, которые вы хотите на нажатом ключе. Я решил использовать .char атрибут .char , который будет иметь скрипт для печати каждого нажатия клавиши.

Да. На самом деле есть несколько разных способов сделать это.

Вы можете создать StringVar , прикрепить его к записи и trace за изменениями; вы можете bind все соответствующие события; или вы можете добавить команду проверки, которая срабатывает в любой из нескольких точек в последовательности. Все они делают несколько разные вещи.

Когда пользователь вводит 4 , есть ключевое событие с только 4 в нем (что не позволяет вам различать, добавлял ли пользователь 4 к концу или посередине, или заменяя целые выбранные слова или …) а затем событие модификации запускается со старым текстом *, а затем функция «ключ» или «все» проверяется с помощью (предлагаемого) нового текста, и переменная обновляется (принятым) новым текстом (если только функция validation возвращает false, и в этом случае вместо invalidcommand вызывается invalidcommand ).


Я не знаю, какой из них вы хотите, поэтому давайте покажем их все, и вы сможете поиграть с ними и выбрать тот, который вы хотите.

 import Tkinter as tk root = tk.Tk() def validate(newtext): print('validate: {}'.format(newtext)) return True vcmd = root.register(validate) def key(event): print('key: {}'.format(event.char)) def var(*args): print('var: {} (args {})'.format(svar.get(), args)) svar = tk.StringVar() svar.trace('w', var) entry = tk.Entry(root, textvariable=svar, validate="key", validatecommand=(vcmd, '%P')) entry.bind('<Key>', key) entry.pack() root.mainloop() 

Синтаксис для обратных вызовов переменных трасс немного сложный, и не тот, который хорошо документирован в Tkinter; если вы хотите знать, что означают первые два аргумента, вам нужно прочитать документы Tcl / Tk и понять, как Tkinter сопоставляет ваш конкретный StringVar с именем Tcl 'PY_VAR0' … На самом деле, гораздо проще просто создать отдельную функцию для каждой переменной и режима, который вы хотите отслеживать, и игнорировать аргументы.

Синтаксис для функций проверки еще сложнее и намного более гибкий, чем я показал. Например, вы можете получить вставленный текст (который может быть более одного символа, в случае операции вставки), его положение и все другие вещи … но ничто из этого не описано нигде в документах Tkinter, поэтому вы необходимо будет обратиться к документам Tcl / Tk . Наиболее распространенная вещь, которую вы хотите, – это предлагаемый новый текст в качестве аргумента, и для этого используйте (vcmd, '%P') .


Во всяком случае, вам обязательно нужно играть с различными вещами и посмотреть, что дает вам каждый механизм. Перемещайте курсор или выберите часть строки перед вводом, вставьте с помощью клавиатуры и с помощью мыши, перетащите выделение, нажмете различные специальные клавиши и т. Д.


* Я проигнорирую этот шаг, потому что в разных версиях Tk он отличается, и в любом случае это не очень полезно. В случаях, когда вам действительно нужно модифицированное событие, вероятно, лучше использовать виджет « Text и привязать <<Modified>> .

  • Как я могу отправить многопроцессорную обработку процесса python на Tkinter gui
  • Удалите окно Tkinter в Python
  • Tkinter управляет моими циклами событий рядом с моим основным окошком
  • Tkinter: AttributeError: NoneType-объект не имеет атрибута get
  • Сделать виджет Tkinter в фокусе
  • Python: установите флажок - самый простой способ
  • Как обновить виджеты в Tkinter?
  • Размер рамки Tkinter
  • Python - лучший язык программирования в мире.