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

将Matplotlib嵌入PySimpleGUI后,如何程序化进入平移模式?

解决方案:直接调用自定义Toolbar实例的pan方法

在你的代码中,既然是手动创建了Toolbar(继承自NavigationToolbar2Tk)实例,完全不需要通过fig.canvas.manager来获取工具栏,直接保存这个实例并调用它的pan()方法即可实现编程进入平移模式的需求。

修改步骤

  1. 调整draw_figure_w_toolbar函数,让它同时返回画布对象和创建好的toolbar实例
  2. 在需要触发平移模式的时机(比如初始化阶段、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:31:04