2017-10-05 46 views
0

我有一個例程,通過迷宮中的路徑動畫,使用Tkinter的after函數按順序繪製路徑中的步驟。我更新了每次調用時檢查的計數器變量,當我到達路徑末尾時,我重置了一些變量。這一切似乎工作正常,但這種方法線程安全嗎?每次after()調用都會以原子方式並按順序執行,即使之前的後續調用在下一個調用應該開始之前未完成?我在代碼的另一部分中使用這些變量來阻止用戶在第一個路徑仍在進行時渲染第二個路徑。有沒有更好的方法來做到這一點?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只是將一個項目放置在事件隊列中。隊列按順序處理。正因爲如此,第二份工作在第一份工作完成之前就不可能開始。

有一個例外:如果第一份工作明確要求更新()有時接下來的工作的定時器超時後,第一份工作將暫停,因爲update(),直到下一個作業完成之前,不會返回沒有更多要處理的事件。

這是一個很好的例子,你爲什麼幾乎不應該撥打update()

+0

謝謝。這回答了我的問題。 – krishnar