4

我有一个简单的代码来使用 tkinter 可视化一些数据。单击按钮将绑定到重绘数据的下一个“帧”的函数。但是,我希望可以选择以一定频率自动重绘。在 GUI 编程方面,我非常熟悉(我不需要为这段代码做很多事情),所以我的大部分 tkinter 知识来自于跟随和修改示例。我想我可以使用 root.after 来实现这一点,但我不太确定我是否理解其他代码的方式。我的程序的基本结构如下:

# class for simulation data
# --------------------------------

def Visualisation:

   def __init__(self, args):
       # sets up the object


   def update_canvas(self, Event):
       # draws the next frame

       canvas.delete(ALL)

       # draw some stuff
       canvas.create_........


# gui section
# ---------------------------------------

# initialise the visualisation object
vis = Visualisation(s, canvasWidth, canvasHeight)

# Tkinter initialisation
root = Tk()
canvas = Canvas(root, width = canvasWidth, height = canvasHeight)

# set mouse click to advance the simulation
canvas.grid(column=0, row=0, sticky=(N, W, E, S))
canvas.bind('<Button-1>', vis.update_canvas)

# run the main loop
root.mainloop()

很抱歉提出一个我确信有一个明显而简单的答案的问题。非常感谢。

4

2 回答 2

12

使用 Tkinter 执行动画或周期性任务的基本模式是编写一个绘制单个帧或执行单个任务的函数。然后,使用这样的东西定期调用它:

def animate(self):
    self.draw_one_frame()
    self.after(100, self.animate)

一旦您调用此函数一次,它将继续以每秒 10 次的速率绘制帧——每 100 毫秒一次。如果您希望能够在动画开始后停止动画,则可以修改代码以检查标志。例如:

def animate(self):
    if not self.should_stop:
        self.draw_one_frame()
        self.after(100, self.animate)

然后,您将拥有一个按钮,单击该按钮时,将设置self.should_stopFalse

于 2012-07-16T13:09:28.000 回答
1

我只是想添加布莱恩的答案。我没有足够的代表发表评论。

另一个想法是self.after_cancel()用来停止动画。

所以...

def animate(self):
    self.draw_one_frame()
    self.stop_id = self.after(100, self.animate)

def cancel(self):
    self.after_cancel(self.stop_id)
于 2017-06-21T04:53:22.717 回答