2017-10-05 14 views
0

私は、Tkinterのafter関数を使用してパス内のステップを順次プロットする迷路を通るパスをアニメートするルーチンを持っています。各呼び出しでチェックしているカウンタ変数を更新し、パスの最後に到達すると、いくつかの変数をリセットします。それはすべてうまくいくようですが、このアプローチはスレッドセーフですか?前の呼び出しが完了していなくても、次の呼び出しが開始される前に、各after()呼び出しがアトミックかつ順番に実行されますか?これらの変数をコードの別の部分で使用して、最初のものがまだ進行している間にユーザーが2番目のパスを表示しないようにします。これを行うより良い方法はありますか?呼び出し後のTkinterアニメーション - スレッドの安全性

def markPath(self): 
    if self.canvas is None or self.path is None: 
     return 

    for k,i in enumerate(self.path[1:-1]): 
     window.after(20*k,self.placeMarker,i,'#ff0000') 

def placeMarker(self,p,value): 
    x0 = p[0]*self.scale+Maze.offset+4 
    y0 = p[1]*self.scale+Maze.offset+4 
    x1 = x0 + 4 
    y1 = y0 + 4 
    self.canvas.create_rectangle(y0,x0,y1,x1,fill=value) 

    if self.path is not None and (self.counter == len(self.path)-2): 
     self.path = None 
     self.start = None 
     self.end = None 
     self.counter = 0 
    else: 
     self.counter += 1 

答えて

0

Tkinterはシングルスレッドです。 afterは、イベントキューに項目を配置する以外に何も実行しません。キューは順番に処理されます。このため、最初のジョブが終了する前に2番目のジョブを開始することはできません。

一つの例外があります:次のジョブのタイマーが満了した後の最初の仕事は、明示的にいつか更新()を呼び出す場合、次のジョブが終了するまで、それ以上あるまでupdate()が戻らないないので、最初のジョブが一時停止されます処理されるイベント。

update()に電話をかけてはいけない理由の良い例です。

+0

ありがとうございました。これは私の質問に答える。 – krishnar

関連する問題