保持tkinter Progressbar运行,直到创建文件

时间:2014-03-01 10:35:35

标签: python multithreading python-2.7 tkinter progress-bar

我正在尝试向用户提供一个信息弹出窗口,告诉他正在创建一个文件,并且他必须等到它被创建。我有一个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添加到我的代码中以使其正常工作,我将非常感激,因为我从未使用它们而且我完全迷失了。

提前致谢。

1 个答案:

答案 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方法成为实例属性,可以popupcheckfile访问。
  • progressbar.stoppopup.destroy移至checkfile方法。