在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
相关产品推荐
相关产品推荐

