matplotlib窗口状态管理(最大化、最小化、全屏、置顶、控制按钮,基于PyQT5后端)

使用matplotlib绘图时,通常利用matplotlib.pyplot模块的show函数(即常用的plt.show())显示绘图结果,显示的方式是通过后端创建窗口容纳绘图图像,matplotlib支持多种后端,各种后端的实现有所差异,因此matplotlib绘图窗口的状态管理与后端的具体实现息息相关。
在此以PyQT5后端为例,简要演示matplotlib窗口状态切换。

原理

查看源码可知,与matplotlib窗口状态相关源码定义在matplotlib.backends.backend_qt5模块的FigureManagerQT类当中,与窗口状态相关的方法实现均依赖于window属性(即figure.canvas.manager.window),而window属性是PyQT5QMainWindow类的实例。
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值