python - Tkinter 没有响应并且按钮冻结?
问题描述
我正在使用 tkinter 编写一个应用程序,按下按钮时应用程序连接到 sql DB 并运行 sql 查询。我遇到了一个问题,在 sql 查询方法运行时 GUI 显示“没有响应”,完成后又恢复正常。我决定将 sql 查询放在自己的线程中,将 tkinter 的 mainloop 放在自己的线程中,但它根本不起作用......?
def createGUI():
window = Tk()
window.title("Recon Report Generator")
lbl=Label(window, text="Enter Recon File Below", fg='blue', font=("Helvetica", 16))
lbl.place(x=90,y=50)
textBox=Entry(window, text="This is Entry Widget", bd=5)
textBox.place(x=135, y=100)
button=Button(window, height=1, width=15, text="Find Missing",
command=lambda: retrieve_input(textBox,lbl))
button.place(x=140, y=150)
window.geometry("400x400")
window.resizable(False, False)
_thread.start_new_thread(window.mainloop(), (0,))
这是我的 GUI 我将主循环放在线程 0 中
和这里
def retrieve_input(textBox,lbl):
detFile = "'"+(textBox.get())+"'"
lbl.place(x=140,y=50)
lbl.config(text="Enter Recon File Below")
_thread.start_new_thread(runDatabaseQuerys(detFile), (1,))
lbl.config(text="Finished...")
print("Finished Please check file")
我将 sql 查询运行方法放在线程 1 中,它们是独立线程,但我仍然“没有响应”???
解决方案
我被这个问题困扰了很长时间,直到我在 stackoverflow 上找到了关于使用多线程的答案。
您为 sql 查询函数创建一个线程,如下所示
from threading import Thread
Thread(target = retrieve_input, args =(textbox, lbl, )).start()