Python Tkinter:只要线程运行,我如何使我的GUI响应?

时间:2012-06-22 00:39:09

标签: python user-interface tkinter nonblocking

例如:

import threading
import time
import Tkinter


class MyThread(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        print "Step Two"
        time.sleep(20)

class MyApp(Tkinter.Tk):

    def __init__(self):
        Tkinter.Tk.__init__(self)

        self.my_widgets()

    def my_widgets(self):
        self.grid()

        self.my_button = Tkinter.Button(self, text="Start my function",
                                          command=self.my_function)
        self.my_button.grid(row=0, column=0)

    def my_function(self):
        print "Step One" 

        mt = MyThread()
        mt.start()

        while mt.isAlive():
            self.update()

        print "Step Three"

        print "end"

def main():
    my_app = MyApp()
    my_app.mainloop()

if __name__ == "__main__":
    main()

好吧,如果我开始我的例子它按预期工作。我点击一个按钮,my_function启动,GUI响应。但我已经读过我应该避免使用update()。那么,如果有人可以解释为什么以及如何正确等待线程,那将会很好?第二步是一个线程,因为它比第一步和第三步花费更长的时间,否则会阻止GUI。

我是Python的新手,我正在尝试编写我的第一个“程序”。也许我正在以错误的方式思考,因为我不是很有经验......

此致 大卫。

1 个答案:

答案 0 :(得分:2)

你需要记住你有一个事件循环在运行,所以你需要做的就是每次事件循环进行迭代时检查线程。好吧,不是每个时间,而是定期。

例如:

def check_thread(self):
    # Still alive? Check again in half a second
    if self.mt.isAlive():
        self.after(500, self.check_thread)
    else:
        print "Step Three"

def my_function(self):
    self.mt = MyThread()
    self.mt.start()
    self.check_thread()