当我的程序执行时,python GUI冻结。这是我的主要代码。我可以帮忙做线程吗?所以执行发生在后台,如果我想结束执行,我仍然可以使用GUI中的“x”按钮?目前我只是要求用户关闭cmd以结束程序。
if __name__ == "__main__":
root = Tk()
root.title('Log')
root.geometry("400x220")
font1=('times', 15)
font2=('times', 10)
#Label inside root
Label(root, relief=GROOVE, font=font2, text="level").pack()
variable = StringVar(root)
variable.set("INFO") # default value
w = OptionMenu(root, variable, "CRITICAL", "DEBUG")
w.pack()
Button(root, font=font1, background= "yellow", text='START',command=main).pack()
Label(root, text="To end just close the CMD window").pack()
root.mainloop()
答案 0 :(得分:1)
UPDATE:关闭Button回调是自动运行launch
,因为函数对象没有被设置为回调,被调用的函数本身就是。修复是替换回调lambda: spawnthread(fcn)
,以便将函数对象设置为回调。答案已更新,以反映这一点。很抱歉错过了。
当您尝试运行某些其他功能时,GUI主循环将冻结,并且无法自行重启(因为它已被冻结。)
让我们说,您希望与GUI主循环一起运行的命令是myfunction
。
进口:
import time
import threading
import Queue
您需要设置ThreadedClient
班级:
class ThreadedClient(threading.Thread):
def __init__(self, queue, fcn):
threading.Thread.__init__(self)
self.queue = queue
self.fcn = fcn
def run(self)
time.sleep(1)
self.queue.put(self.fcn())
def spawnthread(fcn):
thread = ThreadedClient(queue, fcn)
thread.start()
periodiccall(thread)
def periodiccall(thread):
if(thread.is_alive()):
root.After(100, lambda: periodiccall(thread))
然后,您希望调用该函数的窗口小部件调用spawnthread
函数:
queue = Queue.Queue()
Button(root, text='START',command=lambda: spawnthread(myfunction)).pack() #<---- HERE
N.B。我正在使用我所拥有的多线程tkinter GUI进行调整;我把所有的框架都放在课堂上,所以这可能有一些错误,因为我不得不稍微调整一下。