将Matplotlib嵌入PySimpleGUI后,如何程序化进入平移模式?
解决方案:直接调用自定义Toolbar实例的pan方法
在你的代码中,既然是手动创建了Toolbar(继承自NavigationToolbar2Tk)实例,完全不需要通过fig.canvas.manager来获取工具栏,直接保存这个实例并调用它的pan()方法即可实现编程进入平移模式的需求。
修改步骤
- 调整
draw_figure_w_toolbar函数,让它同时返回画布对象和创建好的toolbar实例 - 在需要触发平移模式的时机(比如初始化阶段、GUI事件触发时),调用
toolbar.pan(),并同步更新工具栏状态与画布
修改后的完整代码
import matplotlib.pyplot as plt import PySimpleGUI as sg import numpy as np from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk """----------------------------- matplotlib stuff -----------------------------""" fig = plt.figure() ax = fig.add_subplot(1, 1, 1) x_data = np.linspace(-42, 42, 300) ax.plot(x_data, np.sin(x_data)) """----------------------------- PySimpleGUI stuff -----------------------------""" # 添加测试按钮,方便触发平移模式 window_layout = [ [sg.Button('进入平移模式', key='-PAN_MODE-')], [sg.Canvas(key="-CANVAS_TOOLBAR-")], [sg.Canvas(key="-CANVAS_FIG-")] ] window = sg.Window('Window', window_layout, resizable=True, finalize=True) """--------------------- embedding matplotlib into the GUI ---------------------""" class Toolbar(NavigationToolbar2Tk): def __init__(self, *args, **kwargs): super(Toolbar, self).__init__(*args, **kwargs) def draw_figure_w_toolbar(canvas_fig, canvas_toolbar, figure): figure_canvas_agg = FigureCanvasTkAgg(figure, canvas_fig) toolbar = Toolbar(figure_canvas_agg, canvas_toolbar) figure_canvas_agg.draw() toolbar.update() figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=True) # 同时返回画布和工具栏实例 return figure_canvas_agg, toolbar # 获取画布与工具栏对象 fig_agg, toolbar = draw_figure_w_toolbar(window['-CANVAS_FIG-'].TKCanvas, window['-CANVAS_TOOLBAR-'].TKCanvas, fig) """-------------------------- reading the GUI window --------------------------""" while True: event, values = window.read() if event in (sg.WIN_CLOSED, "-ESCAPE-"): break elif event == '-PAN_MODE-': # 调用pan方法切换到平移模式 toolbar.pan() # 更新工具栏按钮选中状态,让平移按钮高亮显示 toolbar.active_tool = 'pan' toolbar._update_buttons_checked() # 刷新画布同步状态 fig_agg.draw() window.close()
关键说明
- 由于嵌入过程中手动实例化了
Toolbar,直接持有该实例就能调用所有原生工具栏方法,包括pan() - 调用
pan()后,需要通过toolbar.active_tool和toolbar._update_buttons_checked()更新按钮的激活状态,保证界面显示与功能同步 - 最后调用
fig_agg.draw()刷新画布,确保状态生效
内容的提问来源于stack exchange,提问作者Username_22
相关产品推荐
相关产品推荐

