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

Matplotlib自定义工具栏按钮:实现激活状态显示功能

解决Matplotlib自定义工具栏按钮的激活状态视觉反馈问题

要实现自定义工具栏按钮的激活/未激活状态切换(如凹陷变暗或颜色变化),可通过以下两种方法实现:

方法一:使用内置ToolToggleBase类(推荐)

Matplotlib的ToolToggleBase是专门用于切换状态的工具类,自带激活状态的视觉反馈(和导航组按钮的凹陷效果一致),无需手动修改样式:

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolToggleBase

matplotlib.rcParams["toolbar"] = "toolmanager"


class DrawPointsTool(ToolToggleBase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def trigger(self, sender, event, data=None):
        # self.active由父类自动管理,对应按钮激活状态
        if self.active:
            print("Drawing points enabled")
            # 此处添加你的点绘制逻辑
        else:
            print("Drawing points disabled")


if __name__ == "__main__":
    fig, ax = plt.subplots(2, 1)
    ax[0].set_title('Toggle Draw Points')

    # 添加自定义按钮到工具栏
    tm = fig.canvas.manager.toolmanager
    tm.add_tool('draw_points', DrawPointsTool)
    fig.canvas.manager.toolbar.add_tool(tm.get_tool('draw_points'), "toolgroup")
    plt.show()

点击按钮时会自动呈现导航按钮同款的凹陷变暗效果,再次点击恢复原状,状态切换逻辑由父类自动处理。

方法二:自定义按钮样式(个性化需求场景)

如果需要更个性化的视觉反馈(如修改按钮背景色),可在ToolBase中手动获取按钮控件并修改样式(以Qt后端为例):

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backend_tools import ToolBase

matplotlib.rcParams["toolbar"] = "toolmanager"


class DrawPointsTool(ToolBase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.points_enabled = False
        self.button = None  # 存储按钮控件引用

    def trigger(self, sender, event, data=None):
        self.points_enabled = not self.points_enabled
        # 首次触发时获取按钮控件
        if not self.button:
            self.button = self.toolbar._items[self.id][0]
        
        # 根据状态切换样式
        if self.points_enabled:
            print("Drawing points enabled")
            # 激活状态:背景变暗+凹陷边框
            self.button.setStyleSheet("background-color: #cccccc; border-style: inset;")
        else:
            print("Drawing points disabled")
            # 恢复默认样式
            self.button.setStyleSheet("")


if __name__ == "__main__":
    fig, ax = plt.subplots(2, 1)
    ax[0].set_title('Toggle Draw Points')

    tm = fig.canvas.manager.toolmanager
    tm.add_tool('draw_points', DrawPointsTool)
    toolbar = fig.canvas.manager.toolbar
    toolbar.add_tool(tm.get_tool('draw_points'), "toolgroup")
    # 给工具类传递工具栏引用
    tm.get_tool('draw_points').toolbar = toolbar
    
    plt.show()

注意事项

  • 方法二依赖Qt后端控件API,若使用其他后端(如TkAgg),需对应修改控件获取和样式设置逻辑。
  • ToolToggleBase是最简洁的实现方式,优先推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:51:15