我有一个GUI,可以让用户选择运行一系列测试。
这些测试在线程中运行,因为它们使用MIDI数据。
我有checkQueue()
函数使用after()
运行但是一旦用户选择了测试,在函数完成之前不再调用checkQueue()
函数。
如何在buttonTest()
函数期间让checkQueue继续运行,以便我可以使用测试中的数据来更新GUI?
以下是我的代码的简化版本:
import Tkinter as tk
import Queue
class Program(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initUI()
self.q = Queue.Queue()
self.after(200, checkQueue, self.q, self)
def initUI(self):
start = tk.Button(self.parent, command=self.runTest, text="Run Test 1")
start.pack()
self.instruction = tk.Label(self.parent, text="Press Button 1")
self.instruction.pack()
def runTest(self):
buttonTest(self)
def checkQueue(q,app):
print "Calling checkQueue"
while not q.empty():
#HandleData (update a label/canvas etc.)
app.update()
app.after(200, checkQueue,q,app)
def buttonTest(gui):
#Does lots of functions but is just a while for this example
x=1
while x==1:
if x == 100:
gui.q.put("Some Data")
def main():
root = tk.Tk()
root.configure(background="black")
app = Program(root)
root.mainloop()
root.destroy()
if __name__ == "__main__":
main()
答案 0 :(得分:0)
我假设buttonTest
是调用正在其他线程中运行的测试的函数。即使实际工作是在子线程中完成的,buttonTest
仍然在主线程中运行,并且其while
循环正在占用所有主线程的处理周期。尝试在自己的线程中启动buttonTest
。这将为主线提供处理checkQueue
电话所需的喘息空间。
def runTest(self):
Thread(target=buttonTest, args=(self,)).start()