Вам необходимо создать account_number_var вне функции create_login_screen()
, иначе он будет удален при выходе из функции.
Обычный способ привязать кнопку к функции - использовать аргумент command
.Когда у вас есть одна функция, которая обрабатывает обратный вызов от многих кнопок, обычный способ - использовать lambda
.
Пример ниже:
import tkinter as tk
win = tk.Tk()
account_number_var = tk.StringVar() # Create outside function
pin_number_var = tk.StringVar()
def handle_pin_button(digit):
account_number_var.set(digit)
def create_login_screen():
accLabel = tk.Label(win, text="Acount Number / Pin")
accLabel.grid(row=1, column=0)
account_number_entry = tk.Entry(win, textvariable=account_number_var)
account_number_entry.grid(row=1, column=1)
account_number_entry.focus_set()
account_pin_entry = tk.Entry(win, show='*', text='PIN Number',
textvariable=pin_number_var)
account_pin_entry.grid(row=1, column=2)
# Buttons 1, 2 and 3 here. Buttons are bound to 'handle_pin_button' function via '<Button-1>' event.
button1 = tk.Button(text="1", command=lambda:handle_pin_button("1"))
button1.grid(row=2, column=0, sticky="NESW")
button2 = tk.Button(text="2", command=lambda:handle_pin_button("2"))
button2.grid(row=2, column=1, sticky="NESW")
button3 = tk.Button(text="3", command=lambda:handle_pin_button("3"))
button3.grid(row=2, column=2, sticky="NESW")
create_login_screen()
win.mainloop()
Как сделать это с bind()
вместоbutton command
:
Сначала вам нужно отследить кнопки.Поскольку они создаются внутри функции, вы должны сохранить ссылку в глобальной области видимости.
Во-вторых, вы должны рассчитать значение кнопки по индексу списка и соответственно установить account_number_var
.
Затем свяжите кнопки с обработчиком обратного вызова.
import tkinter as tk
win = tk.Tk()
account_number_var = tk.StringVar() # Create outside function
pin_number_var = tk.StringVar()
button_list = [] # Global button reference list
def handle_pin_button(event):
button_number = button_list.index(event.widget) + 1
account_number_var.set(str(button_number))
def create_login_screen():
accLabel = tk.Label(win, text="Acount Number / Pin")
accLabel.grid(row=1, column=0)
account_number_entry = tk.Entry(win, textvariable=account_number_var)
account_number_entry.grid(row=1, column=1)
account_number_entry.focus_set()
account_pin_entry = tk.Entry(win, show='*', text='PIN Number',
textvariable=pin_number_var)
account_pin_entry.grid(row=1, column=2)
# Buttons 1, 2 and 3 here. Buttons are bound to 'handle_pin_button' function via '<Button-1>' event.
button1 = tk.Button(text="1")
button1.grid(row=2, column=0, sticky="NESW")
button1.bind('<Button-1>', handle_pin_button)
button_list.append(button1) # Add button to global list
button2 = tk.Button(text="2")
button2.grid(row=2, column=1, sticky="NESW")
button2.bind('<Button-1>', handle_pin_button)
button_list.append(button2) # Add button to global list
button3 = tk.Button(text="3")
button3.grid(row=2, column=2, sticky="NESW")
button3.bind('<Button-1>', handle_pin_button)
button_list.append(button3) # Add button to global list
create_login_screen()
win.mainloop()