python在画布上显示动态图_python - 更新Tkinter中的matplotlib动画FigureCanvasTkAgg,带有Button / clear循环动画,来自画布...

该博客讨论了如何在Tkinter GUI中创建一个显示动态图的程序,特别是使用matplotlib的FigureCanvasTkAgg。作者遇到的问题是,当点击按钮切换事件动画时,旧的动画不会清除,导致重叠。代码中包含了用于生成和更新动画的函数,但需要解决动画重叠的问题。作者寻求解决方案,希望能清除画布并在显示新动画前避免图像重叠。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在尝试用tkinter创建一个GUI,它向我展示我捕获的事件的动画,当我点击一个按钮时,应该显示下一个事件 . 到目前为止,我的代码正是如此,但我遇到的问题是,当我点击按钮显示下一个事件时,旧事件不会从画布中清除,因此两者重叠,或者当我点击更多时显示动画 .

我的代码看起来像这样:

import matplotlib.pyplot as plt

from matplotlib import animation

import Tkinter as tk

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# Framenumber of Images that shall be animated

# shape(Frames) = (number_of_events, frames_per_event)

Frames = get_Frames(tdms_file)

# event that shall be analysed

k = 0

fig = plt.figure()

ax = fig.add_subplot(111)

root = tk.Tk()

root.title("My Animation GUI")

canvas = FigureCanvasTkAgg(fig, master=root)

canvas.show()

canvas.get_tk_widget().grid(row=0,column=1)

def event_animation(Frames, ax, k, canvas):

ims = []

for i in range(len(Frames[k])):

Image = get_image(Frames[k], i) # function that grabs the images from a different file

im = ax.imshow(Image, cmap='gray', animated=True)

ims.append([im])

ani = animation.ArtistAnimation(fig, ims, interval=25, blit=True, repeat_delay=1000)

canvas.show()

# show next event

def next_event():

global k

k += 1

ani_show = event_animation(Frames, ax, k, canvas)

# show previous event

def prev_event():

global k

k -= 1

ani_show = event_animation(Frames, ax, k, canvas)

prev_cell_button = tk.Button(root, text='<--', width=10, command = prev_cell)

prev_cell_button.grid(row=0, column=0)

next_cell_button = tk.Button(root, text='-->', width=10, command = next_cell)

next_cell_button.grid(row=0, column=2)

tk.mainloop()

创建动画的功能如下所示:

def event_Funcanimation(Frames, ax, k, canvas):

Image = get_image(Frames[k], 0)

im = ax.imshow(Image, cmap='gray', animated=True)

def ani_iterator():

i = 0

while i < len(Frames[k]):

if not stop:

Image = get_image(Frames[k], i)

i += 1

yield Image

def show_image(ani_iterator):

Image = ani_iterator

im.set_array(Image)

return im,

ani = animation.FuncAnimation(fig, show_image, ani_iterator,

blit=True, interval=25, repeat = True)

canvas.draw()

return ani

当我点击其中一个按钮时,while循环中的 stop 变量将被更改 . 我知道这对我的代码无论如何都有用 .

现在的问题是,动画在画布中保持循环,当新动画启动时,它们会重叠 . 如果在开始新动画之前有可能从画布中清除动画,我认为这个问题可以很容易地解决 . 但我找不到任何可以解决我的问题的解决方案 . 我想要动画循环,所以设置 repeat = False 不是一个选项 . 这也没有解决问题,因为动画仍然会重叠,除非它们已经完成 .

在此先感谢您的帮助 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值