好的,我以非常具体的方式问过这个问题: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
感谢
答案 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()