我正在尝试为长时间运行的东西编写GUI,但似乎无法弄清楚如何避免锁定GUI线程。我想使用ttk.Progressbar但我似乎无法更新条形值并让窗口更新GUI。我已经尝试将更新处理放在自己的函数中并直接更新但是都没有工作。更新处理程序中的值是我更喜欢做的事情,因为这个脚本会进行一些下载,然后处理,然后上传和三个单独的栏会看起来不错。
from Tkinter import *
import time, ttk
class SampleApp(Frame):
def __init__(self,master):
Frame.__init__(self,master)
self.pack()
self.prog = ttk.Progressbar(self, orient = 'horizontal', length = 200, mode = 'determinate')
self.prog.pack()
self.button = Button(self,text='start',command=self.start)
self.button.pack()
def start(self):
self.current = 0
self.prog["value"] = 0
self.max = 10
self.prog["maximum"] = self.max
self.main_prog()
def handler(self):
self.prog['value'] += 1
def main_prog(self):
for x in range(10):
time.sleep(2)
self.handler()
root = Tk()
app = SampleApp(master = root)
app.mainloop()
答案 0 :(得分:2)
导致锁定的进度条不是,而是您对time.sleep()
的调用
GUI工具包使用事件循环来处理用户输入。您正在使用睡眠呼叫中断事件处理。
有几种方法可以在事件驱动的程序中处理长时间运行的作业;
after
方法,将作业分成小块并在超时时处理每个小块。multiprocessing
在单独的流程中处理处理。使用队列向该进程发送数据和从该进程发送数据。 GUI程序从队列中读取并在超时时更新GUI。