使用matplotlib
绘图时,通常利用matplotlib.pyplot
模块的show
函数(即常用的plt.show()
)显示绘图结果,显示的方式是通过后端创建窗口容纳绘图图像,matplotlib
支持多种后端,各种后端的实现有所差异,因此matplotlib
绘图窗口的状态管理与后端的具体实现息息相关。
在此以PyQT5
后端为例,简要演示matplotlib
窗口状态切换。
原理
查看源码可知,与matplotlib
窗口状态相关源码定义在matplotlib.backends.backend_qt5
模块的FigureManagerQT
类当中,与窗口状态相关的方法实现均依赖于window
属性(即figure.canvas.manager.window
),而window
属性是PyQT5
中QMainWindow
类的实例。
在matplotlib
中,仅定义了全屏切换full_screen_toggle()
方法的实现,未定义窗口最大化、最小化、置顶等实现,根据PyQT5
相关知识,窗口状态切换的重要定义如下:
- 窗口全屏
figure .canvas.manager.window.showFullScreen()
- 窗口最大化
figure .canvas.manager.window.showMaximized()
- 窗口最小化
figure .canvas.manager.window.showMinimized()
- 窗口正常状态
figure .canvas.manager.window.showNormal()
- 窗口置顶
fig.canvas.manager.window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
- 自定义窗口控制按钮(仅显示关闭按钮)
fig.canvas.manager.window.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowCloseButtonHint)
在窗口置顶和控制按钮实现中,需要使用setWindowFlags
方法,其参数为WindowType
,在QT中为枚举类型(enum),具体取值参考https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qt.html#WindowType。
案例
功能:以工具栏工具按钮形式调用窗口状态管理方法。
from matplotlib.backend_tools import ToolBase, ToolToggleBase
import matplotlib.pyplot as plt
from PyQt5 import QtCore
plt.rcParams['toolbar'] = 'toolmanager'
class showMax(ToolToggleBase):
description = '最大化切换'
def enable(self, *args, **kwargs):
fig.canvas.manager.window.showMaximized()
def disable(self, *args, **kwargs):
fig.canvas.manager.window.showNormal()
class showFullScreen(ToolToggleBase):
description = '全屏切换'
def enable(self, *args, **kwargs):
fig.canvas.manager.window.showFullScreen()
def disable(self, *args, **kwargs):
fig.canvas.manager.window.showNormal()
class showMin(ToolBase):
description = '最小化'
def trigger(self, *args, **kwargs):
fig.canvas.manager.window.showMinimized()
class showStayOnTop(ToolToggleBase):
description = '置顶切换'
def enable(self, *args, **kwargs):
fig.canvas.manager.window.setWindowFlags(
QtCore.Qt.WindowStaysOnTopHint)
fig.canvas.manager.window.show()
def disable(self, *args, **kwargs):
fig.canvas.manager.window.setWindowFlags(QtCore.Qt.Window)
fig.canvas.manager.window.show()
class controlBox(ToolToggleBase):
description = '自定义显示控制按钮'
def enable(self, *args, **kwargs):
fig.canvas.manager.window.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint |
QtCore.Qt.WindowCloseButtonHint)
fig.canvas.manager.window.show()
def disable(self, *args, **kwargs):
fig.canvas.manager.window.setWindowFlags(QtCore.Qt.Window)
fig.canvas.manager.window.show()
fig = plt.figure()
plt.plot([1, 2])
fig.canvas.manager.toolmanager.add_tool('最大化', showMax)
fig.canvas.manager.toolbar.add_tool('最大化', 'window_state')
fig.canvas.manager.toolmanager.add_tool('最小化', showMin)
fig.canvas.manager.toolbar.add_tool('最小化', 'window_state')
fig.canvas.manager.toolmanager.add_tool('全屏显示', showFullScreen)
fig.canvas.manager.toolbar.add_tool('全屏显示', 'window_state')
fig.canvas.manager.toolmanager.add_tool('置顶', showStayOnTop)
fig.canvas.manager.toolbar.add_tool('置顶', 'window_state')
fig.canvas.manager.toolmanager.add_tool('自定义标题栏', controlBox)
fig.canvas.manager.toolbar.add_tool('自定义标题栏', 'window_state')
plt.show()