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() の使用を避けるべきであることを読みました。それで、スレッドを正しく待たなければならない理由と方法を誰かが説明できればいいのですが?ステップ 2 は、ステップ 1 およびステップ 3 よりもはるかに長い時間がかかるため、スレッド内にあります。そうしないと、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 に答える