让tkinter进度条持续运行直到文件创建

1 投票
1 回答
3547 浏览
提问于 2025-04-17 20:24

我想给用户显示一个信息弹窗,告诉他们正在创建一个文件,并且需要等到文件创建完成。我有一个叫做 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 循环。
  • 通过将 progressbarpopup 设为实例属性,使它们在 checkfile 方法中可以访问。
  • progressbar.stoppopup.destroy 移动到 checkfile 方法中。

撰写回答