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

在PySimpleGUI函数中嵌入Matplotlib图表报错的解决求助

问题:Matplotlib图表嵌入PySimpleGUI子窗口报错及显示问题

错误原因

  • 直接对函数window_graph使用下标访问window_graph['-CANVAS-'],但window_graph是返回窗口的函数,并非已实例化的窗口对象,触发TypeError: 'function' object is not subscriptable。
  • 移除报错语句后图表仍不显示,是因为draw_figure调用时机错误——必须在窗口创建并完成初始化后,才能获取Canvas元素并绘制图表。

修复后的完整代码

fig = gantt(location, done)  # 外部定义的生成图表函数
figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds

def window_graph(): 
    layout_graph = [
        [sg.Text('graph')],
        [sg.Button('close graph')],
        [sg.Canvas(size=(figure_w, figure_h), key='-CANVAS-')],
    ]
    # 添加finalize=True确保窗口元素初始化完成
    return sg.Window('graph', layout_graph, margins=(100,50), modal=True, finalize=True)    

def open_window_graph():    
    graph_window = window_graph()        
    # 窗口实例化后,调用draw_figure绘制图表
    fig_photo = draw_figure(graph_window['-CANVAS-'].TKCanvas, fig)
    while True:
        event, values = graph_window.read()           
        if event == "close graph" or event == sg.WIN_CLOSED:
            graph_window.close()
            break

layout_main = [
    [sg.Text("first page")],
    [sg.Button('open')],
    [sg.Button('close')]
]

window_main = sg.Window('main', layout_main, margins=(500,400))
while True:
    event, values = window_main.read()
    if event == 'open':
         open_window_graph()
    elif event == 'close' or event == sg.WIN_CLOSED:
       break 

关键修改说明

  • 窗口实例化后再访问元素:必须先调用window_graph()得到窗口对象graph_window,才能通过下标访问其内部的'-CANVAS-'元素。
  • 添加finalize参数:创建子窗口时设置finalize=True,让PySimpleGUI完成窗口元素的初始化,确保能获取到TKCanvas对象用于绘制Matplotlib图表。
  • 调整draw_figure调用位置:将图表绘制逻辑移到子窗口创建之后,保证目标Canvas元素已存在。

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:42:49