使用Tkinter,Progressbar和Queue

时间:2013-05-24 17:04:09

标签: python python-2.7 tkinter queue

我希望我的Tkinter Progressbar以递增方式更新。我已尝试按照here提到的示例进行操作。

最初,我在不使用线程的情况下尝试了代码。这导致在"开始"之前出现延迟。按钮甚至出现了。一旦我添加了线程部分,初始UI和Progressbar小部件就会正确显示。

但是,我仍然坚持Progressbar不会增加的问题。也许我的Queue部分代码破坏了它?我做了一些实验,但以下是我最终的结果:

class MainUI:
    def __init__(self, master, queue):
        self.queue = queue
        self.master = master
        self.main_container = Frame(self.master)
        self.main_container.pack()
        self.counter = IntVar()
        self.btn_start = Button(self.main_container, command=self.btn_start_click)
        self.btn_start.configure(
            text="Start", background="Grey",
            padx=50
            )
        self.btn_start.pack(side=LEFT)

    def progress_bar(self):
        self.pbar_top = Toplevel(self.main_container)
        self.download_label = Label(
            self.pbar_top,
            text="Download Bar"
            )
        self.download_label.pack(side=TOP)

        self.download_bar = ttk.Progressbar(
            self.pbar_top, orient="horizontal",
            length=400, mode="determinate",
            variable=self.counter, maximum=5
            )
        self.download_bar.pack(side=TOP)

    def prog_bar_update(self, value):
        self.counter = value

    def btn_start_click(self):    
        self.progress_bar()

    def process_queue(self):
        while self.queue.qsize():
            try:
                value = self.queue.get(0)
                self.prog_bar_update(value)
            except Queue.Empty:
                pass

class Logic:
    def __init__(self, master):
        self.master = master
        self.queue = Queue.Queue()
        self.gui = MainUI(master, self.queue)
        t = threading.Thread(target=self.start_logic)
        t.start()
        self.periodic_call()

    def periodic_call(self):
        self.gui.process_queue()
        self.master.after(100, self.periodic_call)

    def start_logic(self):
        for i in range(4):
            time.sleep(2)
            increment = i
            self.queue.put(increment)

root = Tk()
root.title("Progress Bar Test")
main_ui = Logic(root)
root.mainloop()

上面的代码导致显示进度条,但增量永远不会发生。我想我在这里缺少一些非常基本和明显的东西。有人可以赐教我吗?

1 个答案:

答案 0 :(得分:4)

看一下这行代码:

self.counter = value

在执行此代码行之前,self.counterIntVar的实例。在此声明之后,self.counter只是一个int。将行更改为:

self.counter.set(value)