PySimpleGUI结合Matplotlib点击按钮后Canvas画布不显示新图表问题
PySimpleGUI+Matplotlib按钮切换图表解决方案
问题根因
- 每次点击按钮生成新的
FigureCanvasTkAgg实例时,没有销毁之前的画布组件,新画布直接叠加在旧组件下层被遮挡 - 未清理matplotlib残留的旧绘图对象,存在内存泄漏隐患
修复后完整代码
import matplotlib.pyplot as plt import matplotlib import numpy import numpy as np import PySimpleGUI as psg from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg matplotlib.use('TkAgg') def make_graph_and_put_on_canvas(x, y, xlabel, ylabel, graph_title, canvas): figure,ax=plt.subplots() ax.plot(x, y) ax.set(xlabel=xlabel, ylabel=ylabel, title=graph_title) ax.grid() 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 if __name__ == '__main__': layout = [[psg.B("Button1"),psg.B("Button2")],[psg.Canvas(key="canvas")]] Graph = psg.Window(title="Graph", layout=layout, size=(500, 500)) # 新增变量存储当前激活的画布实例 current_canvas = None while (True): event, Value = Graph.read() if event == psg.WINDOW_CLOSED: Graph.close() break if event=="Button1": # 先销毁旧画布 if current_canvas: current_canvas.get_tk_widget().destroy() plt.close('all') # 绘制新图 x=[0,1,2,3] y=[0,2,4,6] current_canvas = make_graph_and_put_on_canvas(x, y, "x", "y", "y=2x",Graph["canvas"].TKCanvas) if event=="Button2": # 先销毁旧画布 if current_canvas: current_canvas.get_tk_widget().destroy() plt.close('all') # 绘制新图 x = [0, 1, 2, 3] y = [0, 3, 6, 9] current_canvas = make_graph_and_put_on_canvas(x, y, "x", "y", "y=3x",Graph["canvas"].TKCanvas)
内容的提问来源于stack exchange,提问作者Pratik bhatt
相关产品推荐
相关产品推荐

