我正在尝试向用户提供一个信息弹出窗口,告诉他正在创建一个文件,并且他必须等到它被创建。我有一个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()
问题是UI被冻结了,我看不到任何窗口。我想我必须使用Threads
来解决这个问题吗?我是要创建两个线程,一个用于UI,另一个用于checkfile
函数,还是一个就足够了?
如果有人可以将Threads
添加到我的代码中以使其正常工作,我将非常感激,因为我从未使用它们而且我完全迷失了。
提前致谢。
答案 0 :(得分: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
方法。