亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項的案例

 更新時間:2021年02月25日 15:27:50   作者:mighty13  
這篇文章主要介紹了python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項的案例,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

matplotlib工具欄源碼探析一(禁用工具欄、默認工具欄和工具欄管理器三種模式的差異)一文可知matplotlib內(nèi)置實現(xiàn)了多個工具項的實現(xiàn),而默認工具欄中的工具項只是其中的一部分,有沒有方法直接管理工具欄,添加、刪除內(nèi)置工具項?

matplotlib內(nèi)置的工具項

由源碼可知,matplotlib.backend_tools.default_tools變量為字典類型,實例化了基于matplotlib.backend_tools.ToolBase類定義的內(nèi)置工具項。

源碼

default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward,
     'zoom': ToolZoom, 'pan': ToolPan,
     'subplots': 'ToolConfigureSubplots',
     'save': 'ToolSaveFigure',
     'grid': ToolGrid,
     'grid_minor': ToolMinorGrid,
     'fullscreen': ToolFullScreen,
     'quit': ToolQuit,
     'quit_all': ToolQuitAll,
     'allnav': _ToolEnableAllNavigation,
     'nav': _ToolEnableNavigation,
     'xscale': ToolXScale,
     'yscale': ToolYScale,
     'position': ToolCursorPosition,
     _views_positions: ToolViewsPositions,
     'cursor': 'ToolSetCursor',
     'rubberband': 'ToolRubberband',
     'help': 'ToolHelp',
     'copy': 'ToolCopyToClipboard',
     }

驗證

import matplotlib.pyplot as plt
import matplotlib as mpl
from pprint import pprint

plt.rcParams['toolbar'] = 'toolmanager'
fig = plt.gcf()
pprint(mpl.backend_tools.default_tools)

輸出

{'allnav': <class 'matplotlib.backend_tools._ToolEnableAllNavigation'>,
 'back': <class 'matplotlib.backend_tools.ToolBack'>,
 'copy': 'ToolCopyToClipboard',
 'cursor': 'ToolSetCursor',
 'forward': <class 'matplotlib.backend_tools.ToolForward'>,
 'fullscreen': <class 'matplotlib.backend_tools.ToolFullScreen'>,
 'grid': <class 'matplotlib.backend_tools.ToolGrid'>,
 'grid_minor': <class 'matplotlib.backend_tools.ToolMinorGrid'>,
 'help': 'ToolHelp',
 'home': <class 'matplotlib.backend_tools.ToolHome'>,
 'nav': <class 'matplotlib.backend_tools._ToolEnableNavigation'>,
 'pan': <class 'matplotlib.backend_tools.ToolPan'>,
 'position': <class 'matplotlib.backend_tools.ToolCursorPosition'>,
 'quit': <class 'matplotlib.backend_tools.ToolQuit'>,
 'quit_all': <class 'matplotlib.backend_tools.ToolQuitAll'>,
 'rubberband': 'ToolRubberband',
 'save': 'ToolSaveFigure',
 'subplots': 'ToolConfigureSubplots',
 'viewpos': <class 'matplotlib.backend_tools.ToolViewsPositions'>,
 'xscale': <class 'matplotlib.backend_tools.ToolXScale'>,
 'yscale': <class 'matplotlib.backend_tools.ToolYScale'>,
 'zoom': <class 'matplotlib.backend_tools.ToolZoom'>}

使用工具欄管理器管理內(nèi)置工具項

由源碼可知默認工具欄模式toolbar2模式?jīng)]有提供添加、刪除工具項的接口。因此,管理工具欄需要使用工具欄管理器模式toolmanager,與該模式相關(guān)的重要定義有:

  • matplotlib.backend_bases.ToolContainerBase(toolmanager)類:工具欄容器的基類,定義了工具欄編輯的方法。構(gòu)造函數(shù)參數(shù)為toolmanager,表示工具欄容器容納的工具欄。
  • matplotlib.backend_managers.ToolManager(figure=None)類:管理用戶觸發(fā)工具欄工具項按鈕而產(chǎn)生的動作。matplotlib.backend_tools.ToolBase類:所有工具欄工具項的基類,所有工具項均由matplotlib.backend_managers.ToolManager實例化。
  • matplotlib.backend_tools.default_tools變量:字典類型,實例化基于matplotlib.backend_tools.ToolBase類定義的內(nèi)置工具項。
  • matplotlib.backend_tools.default_toolbar_tools變量:嵌套列表,以類似格式[[分組1, [工具1, 工具2 ...]], [分組2, [...]]]定義工具欄布局。
  • matplotlib.backend_tools.add_tools_to_container函數(shù):設(shè)置toolbarmanager模式默認工具欄。

使用系統(tǒng)函數(shù)實現(xiàn)添加工具項

根據(jù)源碼可知,matplotlib.backend_tools.add_tools_to_container函數(shù)可以設(shè)置toolbarmanager模式默認工具欄。

案例

案例說明:為工具欄添加全屏切換工具項。

import matplotlib.pyplot as plt
import matplotlib as mpl

plt.rcParams['toolbar'] = 'toolmanager'
fig = plt.gcf()
# 通過mpl.backend_tools.add_tools_to_container函數(shù)添加工具項
mpl.backend_tools.add_tools_to_container(fig.canvas.manager.toolbar, tools=[['foo', [ 'fullscreen']]])
plt.show()

案例解析:add_tools_to_container函數(shù)有兩個參數(shù)containertools,由源碼可知container參數(shù)的值應(yīng)為fig.canvas.manager.toolbar,tools參數(shù)按照[[分組1, [工具1, 工具2 ...]], [分組2, [...]]]格式取值。

在這里插入圖片描述

使用工具欄管理器實現(xiàn)添加、刪除內(nèi)置工具項

根據(jù)源碼可知:

添加內(nèi)置工具項有兩種方法

  • toolbar對象可以通過add_tool方法添加內(nèi)置工具項,參數(shù)為nametool,name為工具項的名稱,tool為添加的工具項對應(yīng)的類或者字符串。
  • toolbar對象可以通過add_toolitem方法添加內(nèi)置工具項,參數(shù)為name、group、 positionimage_file、 descriptiontoggle,name為工具項的名稱,group為工具項所在組,position為工具項在組中的位置,取值為列表索引,一般取-1即在所在組末尾追加,設(shè)置為0即在所在組的首位,image_file為工具項圖像,值為字符串,description為工具項描述, toggle為是否為切換式工具項,布爾值。
  • 刪除內(nèi)置工具項有兩種方法
  • toolbar對象可以通過remove_toolitem方法刪除內(nèi)置工具項,參數(shù)為name,即工具項的名稱。
  • toolmanager對象可以通過remove_tool方法刪除內(nèi)置工具項,參數(shù)為name,即工具項的名稱。

案例

案例說明:刪除向前工具項,添加全屏切換工具項。

import matplotlib.pyplot as plt
import matplotlib as mpl

plt.rcParams['toolbar'] = 'toolmanager'
fig = plt.gcf()

fig.canvas.manager.toolmanager.remove_tool('forward')
fig.canvas.manager.toolbar.remove_toolitem('back')
fig.canvas.manager.toolbar.add_tool('quit', 'foo')
fig.canvas.manager.toolbar.add_toolitem('fullscreen', 'foo', -1,'fullscreen','fullscreen',False) 

plt.show()

在這里插入圖片描述

總結(jié)

通過工具欄管理器添加、刪除內(nèi)置工具項的方法很多種,需要注意調(diào)用對象、方法、參數(shù),閱讀下面的matplotlib源碼可能會有所啟發(fā)。

相關(guān)源碼

matplotlib.backends.backend_qt5模塊

class FigureManagerQT(FigureManagerBase):
 self.toolbar = self._get_toolbar(self.canvas, self.window)

 if self.toolmanager:
  backend_tools.add_tools_to_manager(self.toolmanager)
  if self.toolbar:
   backend_tools.add_tools_to_container(self.toolbar)

 if self.toolbar:
  self.window.addToolBar(self.toolbar)
  tbs_height = self.toolbar.sizeHint().height()
 else:
  tbs_height = 0
 def _get_toolbar(self, canvas, parent):
  # must be inited after the window, drawingArea and figure
  # attrs are set
  if matplotlib.rcParams['toolbar'] == 'toolbar2':
   toolbar = NavigationToolbar2QT(canvas, parent, True)
  elif matplotlib.rcParams['toolbar'] == 'toolmanager':
   toolbar = ToolbarQt(self.toolmanager, self.window)
  else:
   toolbar = None
  return toolbar
 class ToolbarQt(ToolContainerBase, QtWidgets.QToolBar):
 def __init__(self, toolmanager, parent):
  ToolContainerBase.__init__(self, toolmanager)
  QtWidgets.QToolBar.__init__(self, parent)
  self.setAllowedAreas(
   QtCore.Qt.TopToolBarArea | QtCore.Qt.BottomToolBarArea)
  message_label = QtWidgets.QLabel("")
  message_label.setAlignment(
   QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
  message_label.setSizePolicy(
   QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
         QtWidgets.QSizePolicy.Ignored))
  self._message_action = self.addWidget(message_label)
  self._toolitems = {}
  self._groups = {}

 def add_toolitem(
   self, name, group, position, image_file, description, toggle):

  button = QtWidgets.QToolButton(self)
  if image_file:
   button.setIcon(NavigationToolbar2QT._icon(self, image_file))
  button.setText(name)
  if description:
   button.setToolTip(description)

  def handler():
   self.trigger_tool(name)
  if toggle:
   button.setCheckable(True)
   button.toggled.connect(handler)
  else:
   button.clicked.connect(handler)

  self._toolitems.setdefault(name, [])
  self._add_to_group(group, name, button, position)
  self._toolitems[name].append((button, handler))

 def _add_to_group(self, group, name, button, position):
  gr = self._groups.get(group, [])
  if not gr:
   sep = self.insertSeparator(self._message_action)
   gr.append(sep)
  before = gr[position]
  widget = self.insertWidget(before, button)
  gr.insert(position, widget)
  self._groups[group] = gr

 def toggle_toolitem(self, name, toggled):
  if name not in self._toolitems:
   return
  for button, handler in self._toolitems[name]:
   button.toggled.disconnect(handler)
   button.setChecked(toggled)
   button.toggled.connect(handler)

 def remove_toolitem(self, name):
  for button, handler in self._toolitems[name]:
   button.setParent(None)
  del self._toolitems[name]

 def set_message(self, s):
  self.widgetForAction(self._message_action).setText(s

matplotlib.backend_tools模塊

def add_tools_to_container(container, tools=default_toolbar_tools):
 """
 Add multiple tools to the container.

 Parameters
 ----------
 container : Container
  `backend_bases.ToolContainerBase` object that will get the tools added.
 tools : list, optional
  List in the form ``[[group1, [tool1, tool2 ...]], [group2, [...]]]``
  where the tools ``[tool1, tool2, ...]`` will display in group1.
  See `add_tool` for details.
 """

 for group, grouptools in tools:
  for position, tool in enumerate(grouptools):
   container.add_tool(tool, group, position)
def add_tools_to_manager(toolmanager, tools=default_tools):
 """
 Add multiple tools to a `.ToolManager`.

 Parameters
 ----------
 toolmanager : `.backend_managers.ToolManager`
  Manager to which the tools are added.
 tools : {str: class_like}, optional
  The tools to add in a {name: tool} dict, see `add_tool` for more
  info.
 """

 for name, tool in tools.items():
  toolmanager.add_tool(name, tool)

到此這篇關(guān)于python matplotlib工具欄源碼探析二之添加、刪除內(nèi)置工具項的案例的文章就介紹到這了,更多相關(guān)python matplotlib內(nèi)置工具項內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用matplotlib繪制隨機漫步圖

    Python使用matplotlib繪制隨機漫步圖

    這篇文章主要為大家詳細介紹了使用Python生成隨機漫步數(shù)據(jù),使用matplotlib繪制隨機漫步圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python 實現(xiàn)文件的全備份和差異備份詳解

    Python 實現(xiàn)文件的全備份和差異備份詳解

    這篇文章主要介紹了Python 實現(xiàn)文件的全備份和差異備份詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Python連接SQL Server數(shù)據(jù)庫并實時讀取數(shù)據(jù)

    Python連接SQL Server數(shù)據(jù)庫并實時讀取數(shù)據(jù)

    在Python中,可以使用pyodbc庫來連接SQL Server數(shù)據(jù)庫,并使用pandas庫來進行數(shù)據(jù)處理,下面我們就來講講如何實時讀取SQL Server數(shù)據(jù)庫表,并將數(shù)據(jù)寫入Excel文件,需要的可以參考下
    2023-12-12
  • 使用numpy轉(zhuǎn)換成cupy利用GPU執(zhí)行錯誤

    使用numpy轉(zhuǎn)換成cupy利用GPU執(zhí)行錯誤

    在使用PyInstaller打包Python程序時,可能會遇到缺少模塊的錯誤,尤其是在將Numpy轉(zhuǎn)換為CuPy以利用GPU加速時,如果遇到ModuleNotFoundError,表明PyInstaller沒有包含一些隱式導(dǎo)入的包,解決方法是手動將缺失的包添加到打包目錄中
    2024-09-09
  • django使用django-apscheduler 實現(xiàn)定時任務(wù)的例子

    django使用django-apscheduler 實現(xiàn)定時任務(wù)的例子

    今天小編就為大家分享一篇django使用django-apscheduler 實現(xiàn)定時任務(wù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python如何調(diào)用字典的key

    python如何調(diào)用字典的key

    在本篇文章里小編給大家分享的是關(guān)于python調(diào)用字典的key方法實例,有興趣點朋友們可以參考學(xué)習(xí)下。
    2020-05-05
  • python根據(jù)json數(shù)據(jù)畫疫情分布地圖的詳細代碼

    python根據(jù)json數(shù)據(jù)畫疫情分布地圖的詳細代碼

    這篇文章主要介紹了python根據(jù)json數(shù)據(jù)畫疫情分布地圖的詳細代碼,掌握使用pyecharts構(gòu)建基礎(chǔ)的全國地圖可視化圖表,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Python延遲綁定問題原理及解決方案

    Python延遲綁定問題原理及解決方案

    這篇文章主要介紹了Python延遲綁定問題原理及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python中矩陣庫Numpy基本操作詳解

    Python中矩陣庫Numpy基本操作詳解

    這篇文章主要為大家詳細介紹了Python中矩陣庫Numpy的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • python3使用flask編寫注冊post接口的方法

    python3使用flask編寫注冊post接口的方法

    今天小編就為大家分享一篇python3使用flask編寫注冊post接口的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論