3

例如:

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 新手,我正在尝试编写我的第一个“程序”。也许我的想法不对,因为我不是很有经验......

问候,大卫。

4

1 回答 1

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()
于 2012-06-22T02:11:05.203 回答