You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 03:15:04