Tkinter背景,当圈时

时间:2014-02-10 01:38:47

标签: python user-interface tkinter queue

好的,我以非常具体的方式问过这个问题:https://stackoverflow.com/questions/21667119/tkinter-increment-a-varaible-while-still-running-code

但现在用更多的话来解释它。

我有一个使用tkinter运行的程序。按下按钮时,它会将值放入队列中。

我想要的是能够使用while循环来操作队列中的数据,而代码仍然允许将更多数据添加到队列中。

所以基本上重复了:

Check see if button pressed
if yes : add to queue
if no : do nothing
manipulate queue data. 

检查另一个问题是否需要查看代码,其全部在那里。

我知道很多其他帖子都有这个,但我找不到能够轻松解释它的答案。

简单的代码我可以讨论项目请= D

感谢

1 个答案:

答案 0 :(得分:1)

你的tkinter程序已经运行了一个“while”循环 - mainloop。在大多数情况下,您不需要该循环内的另一个循环。

使用此循环的模式是创建一个函数,它可以为循环体执行所需的操作。它应该完成循环的一次迭代。一旦完成,它需要安排自己在将来某个时间使用after再次调用。未来多远将定义循环的运行速度。

以下是每秒检查一次队列的示例:

import Tkinter as tk
import Queue as queue

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.queue = queue.Queue()

        buttonFrame = tk.Frame(self)
        for i in range(10):
            b = tk.Button(buttonFrame, text=str(i), 
                          command=lambda button=i: self.press(button))
            b.pack(side="top", fill="x")
        self.lb = tk.Listbox(self, width=60, height=20)
        self.vsb = tk.Scrollbar(self, command=self.lb.yview)
        self.lb.configure(yscrollcommand=self.vsb.set)

        buttonFrame.pack(side="left", fill="y")
        self.vsb.pack(side="right", fill="y")
        self.lb.pack(side="left", fill="both", expand=True)

        self.manage_queue()

    def press(self, i):
        '''Add a button to the queue'''
        item = "Button %s" % i
        self.queue.put(item)
        self.log("push", item)

    def log(self, action, item):
        '''Display an action in the listbox'''
        message = "pushed to queue" if action == "push" else "popped from queue"
        message += " '%s' (queue size %s)" % (item, self.queue.qsize())
        self.lb.insert("end", message)
        self.lb.see("end")

    def manage_queue(self):
        '''pull an item off the queue and act on it'''
        try:
            item = self.queue.get_nowait()
            self.log("pop", item)
        except queue.Empty:
            pass

        # repeat again in 1 second
        self.after(1000, self.manage_queue)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()