【发布时间】:2019-03-28 17:57:15
【问题描述】:
我尝试使用线程来实现 Tkinter 进度条,只是为了查看程序何时运行,并在程序结束时关闭进度条。
import tkinter
import ttk
import time
import threading
def task(root):
ft = ttk.Frame()
ft.pack(expand=True, fill=tkinter.BOTH, side=tkinter.TOP)
pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate')
pb_hD.pack(expand=True, fill=tkinter.BOTH, side=tkinter.TOP)
pb_hD.start(50)
root.mainloop()
def process_of_unknown_duration(root):
time.sleep(5)
root.destroy()
def pBar():
root = tkinter.Tk()
t1=threading.Thread(target=process_of_unknown_duration, args=(root,))
t1.start()
task(root) # This will block while the mainloop runs
t1.join()
if __name__ == '__main__':
pBar()
#some function
我的问题是,一旦进度条启动,程序就会挂起,不会做任何其他事情。有什么提示吗?
【问题讨论】:
-
tkinter不支持多线程。您可以使用线程,但它们不能与 GUI 交互。一种解决方法是定期让mainloop()通过通用after()小部件函数调用函数。被调用函数可以访问tkinter函数和小部件。 -
我运行了你的代码,它可以工作。我必须改变的一件事是'import ttk'行。我只是把它改成了'from tkinter import ttk'
-
@RockAndRoleCoder 嗯,我试过了,但似乎没有用
-
也许尝试将你的 root.destroy 移到你的线程之外,并告诉它等待 6 秒而不是 5 秒(让线程有一些时间)。我很好奇要求线程销毁主线程是否会导致您的问题。