让tkinter进度条持续运行直到文件创建
我想给用户显示一个信息弹窗,告诉他们正在创建一个文件,并且需要等到文件创建完成。我有一个叫做 master
的主窗口,它会创建一个 popup
弹窗,里面有一个 Progressbar
和一条消息。这个 popup
窗口必须在文件创建完成后立即关闭。
这是我尝试的代码:
import os
from Tkinter import *
import ttk
class UI(Frame):
def __init__(self,master):
Frame.__init__(self, master)
self.master = master
self.initUI()
def initUI(self):
popup = Toplevel(self)
txt = Label(popup, text="Please wait until the file is created").grid(row=0, column=0)
progressbar = ttk.Progressbar(popup, orient=HORIZONTAL, length=200, mode='indeterminate')
progressbar.grid(row=1, column=0)
progressbar.start()
self.checkfile()
progressbar.stop()
popup.destroy()
def checkfile(self):
while os.path.exists("myfile.txt") == False:
print "not created yet"
if __name__ == "__main__":
root = Tk()
aplicacion = UI(root)
root.mainloop()
问题是,界面会卡住,我看不到任何窗口。我觉得我需要用 Threads
来解决这个问题,对吗?我需要创建两个线程,一个用于界面,另一个用于 checkfile
函数,还是只用一个线程就可以?
如果有人能把 Threads
加到我的代码里,让它能正常工作,我会非常感激,因为我从来没有使用过线程,现在完全搞不清楚。
提前谢谢你们。
1 个回答
1
使用 while
循环会导致用户界面(UI)变得无响应。
可以使用 Widget.after
方法来定期调用 checkfile
方法。
def initUI(self):
self.popup = popup = Toplevel(self)
Label(popup, text="Please wait until the file is created").grid(
row=0, column=0)
self.progressbar = progressbar = ttk.Progressbar(popup,
orient=HORIZONTAL, length=200, mode='indeterminate')
progressbar.grid(row=1, column=0)
progressbar.start()
self.checkfile()
def checkfile(self):
if os.path.exists("myfile.txt"):
print 'found it'
self.progressbar.stop()
self.popup.destroy()
else:
print 'not created yet'
self.after(100, self.checkfile) # Call this method after 100 ms.
修改的内容:
- 用
after
替代了while
循环。 - 通过将
progressbar
和popup
设为实例属性,使它们在checkfile
方法中可以访问。 - 将
progressbar.stop
和popup.destroy
移动到checkfile
方法中。