我想要一个进度条,向用户显示下载进度。当更新GUI和同时下载时,进度条冻结,我明白原因,但我不知道如何解决它。我尝试了多线程处理: Tkinter: How to use threads to preventing main event loop from “freezing”并使用{a2}作为guid来帮助我满足我的需要。问题是我怎样去实现我的目标,当我改变它去做我需要它做的事情时,我总是犯错误。在
我的代码的最基本版本(没有多线程):
from Tkinter import *
import ttk
from urllib import URLopener # Downloading files
# Make frame to tell user what file is getting downloaded
self.Progressmsg = Label(self, text="TempValue")
self.Progressmsg.pack(pady=(10,0))
# Make progress bar to show user download progress
self.Progressbar = ttk.Progressbar(self, mode="determinate", orient='horizontal', lengt=280, maximum=len(self.AllClasses))
self.Progressbar.pack(padx=10, pady=10)
self.Progressbar["value"] = 0
def DownloadFile(Class):
# Update progress message
self.Progressmsg["text"] = "Downloading {0}.ics...".format(Class)
# Download each file from saxion website
CalFile = URLopener()
CalFile.retrieve("http://[school website]/ical/group/{0}.ics".format(Class), "Data/{0}.ics".format(Class))
# Update progress bar
self.Progressbar["value"] += 1
for Study in self.Parameters["Classes"]:
for Class in Study:
DownloadFile(Class)
注意:在这段代码中,AllClasses
是不同类的列表,必须从中下载日历文件。
代码本身是一个相当大的类的一部分,我没有包括这个类。这就是我使用self的原因
当这段代码运行时,progressbar不会加载或更新,所有文件都会正确下载,当它们被下载时,进度条会立即更新所有内容。我的问题是:我该如何解决这个问题?在
试试这个:
如果不起作用,则使用
self.Progressbar.update()
。在如果有其他事情要做(比如下载下一个文件),GUI不会反映您的更改,除非您调用
update_idletasks()
或update()
。在相关问题 更多 >
编程相关推荐