Чтобы получить поведение, которое вы ищете, все, что вам нужно сделать, это:
Измените это:
def handle_button(event):
return var.insert(0,4)
На это:
def handle_button(event):
var.set(4)
Тем не менеев вашем коде есть несколько вещей, которые здесь бесполезны.
Глядя на return var.insert(0, 4)
.Этот return
на самом деле здесь не делает ничего полезного, потому что он пытается вернуть результаты вызова var.insert(0, 4)
и присвоить его тому, что когда-либо вызывало эту функцию.2 основные проблемы с этим.var.insert(0, 4)
не собирается возвращать полезное значение для команды возврата, чтобы помочь, и во-вторых, вы не можете вернуть результат в привязку, которую он не использует.Вместо этого удалите возврат все вместе и просто напишите команду, использованную для обновления StringVar.В этом случае var.set(4)
.
Глядя на var_entry = tk.Entry(win,text='var',textvariable=var)
.text = 'var'
здесь на 100% бесполезен.В поле ввода аргумент text
на самом деле является коротким для textvariable
, поэтому здесь вы присваиваете строку var
текстовой переменной, а затем немедленно переназначаете переменную text для StringVar ().Итак, давайте перепишем эту строку просто var_entry = tk.Entry(win, textvariable=var)
.
Глядя на button1 = tk.Button(win,text = '1' ,textvariable = 1)
, вы делаете здесь что-то, что не поможет.textvariable = 1
здесь не имеет смысла.Так что давайте просто удалим это.Перепишите эту строку как button1 = tk.Button(win, text='1')
Глядя на button1.bind("<Button-1>", handle_button)
- это излишне для чего-то, что кнопка может обработать с аргументом command
.Удалите эту строку полностью и перепишите button1
, чтобы она содержала команду.Например: button1 = tk.Button(win, text='1', command=handle_button)
Глядя на def window():
, мы можем удалить эту функцию, взять ее содержимое и переместить его в глобальное пространство имен.Прямо сейчас нет смысла использовать функцию для настройки GUI, поэтому вместо этого давайте удалим дополнительный шаг.
При всем этом у вас должно быть что-то похожее на это:
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)
def handle_button():
var.set(4)
tk.Button(win, text='1', command=handle_button).grid(row=2, column=0)
win.mainloop()
Я не уверен, что вы уже слышали о lambda
, но его можно использовать здесь, чтобы немного уменьшить наш код.lambda
используется для создания анонимной функции, и это означает, что мы можем создать однострочные функции, которые не требуют от нас определения функции по имени.
Так что, если мы удалим функцию def handle_button():
, а затемизменив команду button1
на лямбду, мы можем сохранить себя еще на 2 строки кода, которые на самом деле не помогают нам и не улучшают читабельность.
Новый конечный код должен выглядеть следующим образом:
import tkinter as tk
win = tk.Tk()
var = tk.StringVar()
var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)
tk.Button(win, text='1', command=lambda: var.set(4)).grid(row=2, column=0)
win.mainloop()
При внесении всех этих изменений мы сократили ваш код пополам, чтобы достичь тех же результатов, и его стало немного чище.