Tkinter: передача текстовых записей в качестве аргумента функции, вызываемой при нажатии кнопки

#python #user-interface #tkinter

#python #пользовательский интерфейс #tkinter

Вопрос:

Я новичок в Tkinter, поэтому извините, если вопрос выглядит тривиальным. Я разработал приложение selenium, и теперь я пытаюсь сделать его интерактивным с Tkinter. У меня возникают некоторые проблемы с передачей текстовых записей в качестве входных данных функции:

Я определил функцию для входа в систему, которая уже была протестирована и работает должным образом:

     def SelfsignIn(user,passw):
        browser = webdriver.Firefox(executable_path='C:Program Files (x86)geckodriver.exe') (You can find the entire code at the end)
    ....
 

Затем я создаю графический интерфейс, который должен принимать имя пользователя и пароль, введенные пользователем, в качестве аргумента функции SelfsignIn:

После некоторых размышлений я придумал этот метод:

     window = tk.Tk()
    window.title("Login Window")
    greeting = tk.Label(text="Welcome")
    greeting.pack()
    username = tk.Label(text="Username")
    username_entry = tk.Entry()
    password = tk.Label(text="Password")
    password_entry = tk.Entry()
    username.pack()
    username_entry.pack()
    password.pack()
    password_entry.pack()
    par1 = str(username_entry.get())
    par2 = str(password_entry.get())
    button = tk.Button(window, text='Log in', width=25,command=lambda: SelfsignIn(par1,par2))
    button.pack()
    window.mainloop()
 

Функция вызывается правильно, фактически веб-страница открывается и выполняет все операции до тех пор, пока не придет время использовать учетные данные. На этом этапе текстовые поля входа не заполняются вводом, указанным в графическом интерфейсе.

Что я делаю не так? Не стесняйтесь давать мне какие-либо предложения, заранее спасибо.

Комментарии:

1. Не могли бы вы предоставить полную функцию SelfSignIn?

2. @Bowolf, спасибо за проявленный интерес. Я думал, что это не имеет значения. Я добавил это в конце вопроса

Ответ №1:

Вы вызываете username_entry.get() примерно через миллисекунду после создания виджета ввода. Пользователь даже не увидит виджет, а тем более не успеет набрать текст.

Не используйте lambda — вызовите соответствующую функцию и попросите функцию получить данные, когда это необходимо, а не раньше. Это облегчит написание вашего кода, его понимание и обслуживание.

 def signin():
    par1 = str(username_entry.get())
    par2 = str(password_entry.get())
    SelfsignIn(par1, par2)
...
button = tk.Button(window, text='Log in', width=25,command=signin)
 

Ответ №2:

Ваша ошибка заключается в том, что вы извлекаете значение полей еще до того, как отобразится графический интерфейс, поэтому, естественно, две строки par1 и par2 будут пустыми.

Вы должны получить значение внутри записи при нажатии кнопки.