点击切换股票时出现“Animation was deleted without rendering anything”报错如何解决
错误原因
- 你在
animate函数内部错误地执行了global anims+anims = []操作,每次动画帧刷新都会清空存储动画实例的列表,刚添加的动画对象没有被长期持有,被Python垃圾回收机制销毁,就触发了你看到的报错。 - 切换股票时旧的动画实例没有停止,既占用资源也会和新动画产生冲突。
- 原有代码还存在缩进错误:
ax1.clear()、ax1.plot()写在遍历数据的for循环内,会导致每次读一行数据就清一次画布,最终仅显示最后一个数据点。
修改方案
- 在事件循环之外提前初始化存储动画实例的列表,不要在动画帧函数里操作这个列表的初始化
- 每次点击新股票加载动画前,先停止之前所有旧动画,清空动画列表
- 移除
animate函数内清空anims的错误代码 - 修正画布绘制逻辑的缩进,等所有数据读取完成后再统一绘图
对应修改后的代码片段
def draw_figure(canvas, figure): figure_canvas_agg = FigureCanvasTkAgg(figure, canvas) figure_canvas_agg.draw() figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1) return figure_canvas_agg fig = plt.figure() draw_figure(_VARS['window']['-Graph-'].TKCanvas, fig) # 提前初始化动画存储列表 anims = [] #------------------------------------------------While loop/Search bar Code-----------------------------------------------------------# while True: event, values = _VARS['window'].read() if event in (sg.WIN_CLOSED, 'Exit'): # always check for closed window break else: if values['-INPUT-'] != '': # if a keystroke entered in search field search = values['-INPUT-'] new_values = [x for x in stockDic if search in x] # do the filtering _VARS['window']['-LIST-'].update(new_values) # display in the listbox else: # display original unfiltered list _VARS['window']['-LIST-'].update(stockDic) # if a list item is chosen if event == '-LIST-' and len(values['-LIST-']): # 新增:先停止旧动画,清空列表 if anims: for old_ani in anims: old_ani.event_source.stop() anims.clear() stockName = values['-LIST-'] name = stockName[0] _VARS['window']['-Name-'].update("Name: {}".format(stockDic[name]["Name"])) _VARS['window']['-Price-'].update("Price: {}".format(stockDic[name]["Price"])) _VARS['window']['-Current_Gain-'].update("Current Gain: {}".format(stockDic[name]["currentGain"])) moment=time.strftime("%Y-%b-%d__%H",time.localtime()) plt.clf() ax1 = fig.add_subplot(1,1,1) def animate(i): # 移除了这里的global anims和anims = []错误代码 pullData = open("csv_files/{}/{}.csv {}".format(stockDic[name]["Name"], stockDic[name]["Name"], moment),"r").read() dataArray = pullData.split('\n') xar = [] yar = [] for eachLine in dataArray: if len(eachLine)>1: x,y = eachLine.split(',') xar.append(int(x)) yar.append(int(y)) # 修正缩进:所有数据读取完成后再清画布绘图 ax1.clear() ax1.plot(xar,yar) ani = animation.FuncAnimation(fig, animate, interval=150) anims.append(ani)
内容的提问来源于stack exchange,提问作者Kasra
相关产品推荐
相关产品推荐

