我有一个tkinter GUI,用户需要在其中对某些系统进行身份验证。当用户单击RUN时,将弹出身份验证顶级,其中用户输入凭据,单击确定,然后应用程序根据这些凭据创建连接实例。
我遇到的困难是传回该连接实例,而使应用程序在成功返回之前无法继续运行。这是一个极其简化的代码段,显示了总体布局。
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()
我从上面得到的结果是,当我单击root上的RUN按钮时,代码print()
的None(无)同时弹出登录屏幕。我已经尝试了很多事情来获取代码
A)成功返回connection
,并且
B)等待返回它,然后再尝试使用它
我没有列出我的无用尝试,而是将代码简单了下来。 感谢您的任何建议!
答案 0 :(得分:3)
解决此问题的通常方法是使用tkinter的wait_window
或wait_variable
方法。在目标窗口被销毁之前(典型的是模式对话框),第一个不会返回; wait_variable
在设置变量之前(非模式对话框很常见)不会返回
程序正在等待时,它仍然能够处理事件。
effbot.org有一个关于创建对话框的简洁明了的文字:http://effbot.org/tkinterbook/tkinter-dialog-windows.htm