从长函数获取数据以更新GUI

时间:2014-10-06 13:31:16

标签: python user-interface tkinter queue

我有一个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()

1 个答案:

答案 0 :(得分:0)

我假设buttonTest是调用正在其他线程中运行的测试的函数。即使实际工作是在子线程中完成的,buttonTest仍然在主线程中运行,并且其while循环正在占用所有主线程的处理周期。尝试在自己的线程中启动buttonTest。这将为主线提供处理checkQueue电话所需的喘息空间。

def runTest(self):
    Thread(target=buttonTest, args=(self,)).start()