Как написать функцию для добавления номера нажатой кнопки к записи номера PIN через связанную с ней переменную? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь создать виртуальную цифровую клавиатуру (с 1,2 и 3), используя python и tkinter.

Если я нажму 1 (button1), то account_number_entry изменится на 1, а если я нажму 2, то account_number_entry долженизмените соответственно.

Я пробовал этот код, но.

    import tkinter as tk
    win = tk.Tk()

    def handle_pin_button(event):
        '''Function to add the number of the button clicked to the PIN number entry via its associated variable.'''
        # Limit to 4 chars in length
        # Set the new pin number on the pin_number_var


    def create_login_screen():
        accLabel = tk.Label(win, text="Acount Number / Pin")
        accLabel.grid(row=1, column=0)

        account_number_var = tk.StringVar()
        account_number_entry = tk.Entry(win, textvariable=account_number_var)
        account_number_entry.grid(row=1, column=1)
        account_number_entry.focus_set()

        pin_number_var = tk.StringVar()
        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.bind('<Button-1>', handle_pin_button)
        button1.grid(row=2, column=0, sticky="NESW")
        button2 = tk.Button(text="2")
        button2.bind('<Button-1>', handle_pin_button)
        button2.grid(row=2, column=1, sticky="NESW")
        button3 = tk.Button(text="3")
        button3.bind('<Button-1>', handle_pin_button)
        button3.grid(row=2, column=2, sticky="NESW")


    create_login_screen()
    tk.mainloop()

1 Ответ

0 голосов
/ 22 сентября 2018

Вам необходимо создать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...