Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用tkinter的简单动画_Python_User Interface_Animation_Tkinter - Fatal编程技术网

Python 使用tkinter的简单动画

Python 使用tkinter的简单动画,python,user-interface,animation,tkinter,Python,User Interface,Animation,Tkinter,我有一个使用tkinter可视化一些数据的简单代码。单击按钮将绑定到重画下一个“帧”数据的函数。但是,我希望可以选择以一定的频率自动重画。我对GUI编程非常熟悉(我不需要为这段代码做太多工作),所以我的大部分tkinter知识都来自下面的示例和修改示例。我想我可以使用root.after来实现这一点,但我不太清楚我是如何从其他代码中理解的。我的程序的基本结构如下: # class for simulation data # -------------------------------- de

我有一个使用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()
模拟数据类 # -------------------------------- def可视化: 定义初始化(self,args): #设置对象 def更新画布(自身、事件): #绘制下一帧 canvas.delete(全部) #画些东西 画布。创建。。。。。。。。 #图形用户界面部分 # --------------------------------------- #初始化可视化对象 vis=可视化(s、画布宽度、画布高度) #Tkinter初始化 root=Tk() 画布=画布(根,宽度=画布宽度,高度=画布高度) #设置鼠标单击以推进模拟 网格(列=0,行=0,粘性=(N,W,E,S)) canvas.bind(“”,vis.update_canvas) #运行主循环 root.mainloop()
很抱歉问了一个问题,我相信这个问题的答案很简单明了。非常感谢。

使用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\u stop设置为False

我只想添加Bryan的答案。我没有足够的代表发表评论

另一种方法是使用
self.after\u cancel()
停止动画

所以


非常感谢布莱恩;我也做过类似的事情,但不知怎的,我的一个事件绑定把事情搞砸了。现在所有操作都正常。如果允许运行,第一个版本会导致最大递归深度到达错误indefinitely@rahultyagi:不,不可能超过最大递归深度,因为它不是递归函数。至少,不是字面意义上的。该函数不调用自身,它只是安排自己在将来再次运行。堆栈深度从未超过1。是的,我只是在另一篇文章中读到了这一点,完全被搞糊涂了:)@AlecKeyserWhite:“如果使用括号调用函数,堆栈深度会增加”-如果是真的,这个答案并不建议使用括号调用函数,这样堆栈增长就不会有问题。
def animate(self):
    self.draw_one_frame()
    self.stop_id = self.after(100, self.animate)

def cancel(self):
    self.after_cancel(self.stop_id)