通话后TKInter动画 - 线程安全



我有一个例行程序,可以使路径通过迷宫进行动画,该路径使用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

tkinter是单线螺纹。after只能将项目放在事件队列上。队列按顺序进行处理。因此,第二份工作不可能在第一个工作结束之前开始。

有一个例外:如果第一份作业明确调用 update()在下一个定时器到期后的某个时候,第一份工作将被暂停,直到下一个作业完成,因为update()才能返回直到没有更多的事件要处理。

这是一个很好的例子,说明您几乎不应该致电update()

最新更新