Возврат от tkinter toplevel нажатием кнопки - PullRequest
0 голосов
/ 28 августа 2018

У меня есть графический интерфейс пользователя tkinter, в котором пользователь должен пройти аутентификацию на какой-либо системе. Когда пользователь нажимает RUN, появляется Toplevel для проверки подлинности, в котором пользователь вводит учетные данные, нажимает кнопку OK, и приложение создает экземпляр подключения из этих учетных данных.

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

import tkinter as tk

def log_in():
    def click_ok():
        username = usr_entry_var.get()
        password = pwd_entry_var.get()

        # This is the portion that creates a connection instance
        # that I desire to later perform actions against in the
        # form of connection.doStuff()
        # I have just set it to some text here for brevity, as this
        # portion is working fine.
        connection = 'someStuffThatAuthenticates'

        login.destroy()

    login = tk.Toplevel()

    usr_lbl = tk.Label(login, text='Username:')
    usr_lbl.grid(column=0, row=0)

    usr_entry_var = tk.StringVar()
    usr_entry = tk.Entry(login, width=40, textvariable=usr_entry_var)
    usr_entry.grid(column=1, row=0)

    pwd_lbl = tk.Label(login, text='Password:')
    pwd_lbl.grid(column=0, row=1)

    pwd_entry_var = tk.StringVar()
    pwd_entry = tk.Entry(login, width=40, textvariable=pwd_entry_var)
    pwd_entry.grid(column=1, row=1)

    ok_btn = tk.Button(login, text='OK', command=click_ok)
    ok_btn.grid(column=0, columnspan=2, row=2)

def click_run():
    connection = log_in()

    # Here is where I perform actions against the returned connection instance.
    # I am just printing it here for brevity.
    print(str(connection))

root = tk.Tk()

run_btn = tk.Button(root, text='RUN', command=click_run)
run_btn.pack()

root.mainloop()

Результаты, которые я получаю из вышеизложенного, состоят в том, что как только я нажимаю кнопку RUN в корневом каталоге, код print() s отсутствует, в то же время появляется экран входа в систему. Я пробовал довольно много вещей, чтобы получить код для

А) вернуть connection успешно и

B) подождите, пока он не вернется, прежде чем пытаться его использовать

Вместо того, чтобы перечислять мои слабые попытки, я просто оставил здесь простой код. Спасибо за любой совет!

1 Ответ

0 голосов
/ 28 августа 2018

Обычный способ решить эту проблему - использовать методы tkinter wait_window или wait_variable. Первое не вернется, пока целевое окно не будет уничтожено (типично для модального диалога), и wait_variable не вернется, пока не будет установлена ​​переменная (обычное для немодальных диалогов)

Пока программа ожидает, она все еще может обрабатывать события.

effbot.org имеет приятную краткую статью о создании диалогов: http://effbot.org/tkinterbook/tkinter-dialog-windows.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...