вручную
Согласно Виджет входа в Tkinter :
Во-первых, вы можете просто прочитать значение из Entry
с помощью
entry.get()
Во-вторых, вы можете связать его с tkinter.Variable
(он создает и переносит глобальную переменную Tcl с автоматически сгенерированным именем). Обычно используется его подкласс StringVar
- он конвертирует значения в str
при получении / установке.
v = tkinter.StringVar()
entry = tk.Entry(root1, textvariable=v)
<...>
value = v.get()
Не большая разница, как вы можете видеть, только добавляет уровень косвенности. Оба метода получат str
, поэтому вам нужно проанализировать его с int()
. Но вы можете использовать IntVar
вместо Variable
(или StringVar
), который будет анализировать его для вас на .get()
(и повысит ValueError
, если это недопустимое целое число).
Автоматически
Чтобы автоматически g обновлять переменную Python при изменении значения Entry
, используйте Variable.trace_add
:
def callback(tcl_name,index,op):
global myvar
# See https://tcl.tk/man/tcl8.6/TclCmd/trace.htm#M14 about the arguments.
# A callback is only passed the name of the underlying Tcl variable
# so have to construct a new Variable of the same class on the fly
# that wraps it to get the value and convert it to the appropriate type.
# Yes, it's this hacky.
try: myvar = StringVar(tcl_name).get()
except ValueError: myvar = None
v.trace_add("write",callback)
Менее хакерским решением для callback
было бы сделать обратный вызов методом экземпляра Variable
- таким образом, он получит ссылку на него через self
вместо того, чтобы создавать новый класс. пример. Значение можно также сделать атрибутом экземпляра:
def callback(self,*args):
try: self.value=self.get()
except ValueError: self.value=None
v.callback=callback
v.trace_add("write",v.callback)
Обратите внимание, что это будет вызываться при каждом изменении - т. Е. Даже при вводе значения - и, следовательно, может вызвать заметные задержки в реакции графического интерфейса пользователя. Поэтому, если вам действительно не нужно постоянно следить за значением, достаточно просто прочитать его один раз в подходящий момент.