我有一个大型代码,按下按钮应该运行一个代码,大约需要15秒才能完成。在这段时间内,我想显示一个标签,上面写着"处理,请稍候"或类似的东西。但是在python中,一旦程序结束,使用tkinter创建的整个GUI将冻结并解冻。我该如何解决这个问题?我创建了一个较小的代码,以便我可以更容易地解释。
from tkinter import *
from threading import Thread
import os
import sys
import time
master = Tk()
master.geometry("500x500")
master.resizable(False,False)
def tryout():
sign2.config(text = "AAA")
for x in range(5):
print(x)
time.sleep(1)
sign2.config(text = "BBB")
for x in range(5):
print(x)
time.sleep(1)
sign2.config(text = "CCC")
def close_window():
master.destroy()
sys.exit()
sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=tryout)
butTest.grid(pady=10, padx=20)
master.mainloop( )
因此,在此代码中,我希望看到“AAA'首先在标签上,然后是' BBB'从0到4的计数中间,然后是CCC'在最终计数结束时从0到4.这里发生的是GUI开始冻结,计数继续进行,我只看到CCC'。我该如何解决这个问题?
答案 0 :(得分:3)
使用线程进行此操作只需进行一些更改。
首先创建一个函数start_tryout
:
def start_tryout():
Thread(target=tryout, daemon=True).start() # deamon=True is important so that you can close the program correctly
然后使用新命令创建按钮:
butTest = Button(master, text='test', command=start_tryout)
然后它应该不再冻结gui,你应该能够看到标签的变化。
答案 1 :(得分:2)
您可以尝试线程化。我在代码下面进行了更改,并在此处进行了测试,并且运行良好。
from tkinter import *
from threading import Thread
import os
import sys
import time
import threading # NEW
master = Tk()
master.geometry("500x500")
master.resizable(False,False)
def tryout():
sign2.config(text = "AAA")
for x in range(5):
print(x)
time.sleep(1)
sign2.config(text = "BBB")
for x in range(5):
print(x)
time.sleep(1)
sign2.config(text = "CCC")
def close_window():
master.destroy()
sys.exit()
def thread(): # NEW
threading.Thread(target=tryout).start() # NEW
sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=thread) # Changed
butTest.grid(pady=10, padx=20)
master.mainloop( )