self.window.windowHandle() 在带有 PySide2 的 backend_qt 中返回 None

问题描述 投票:0回答:1

我正在使用 Python 3.8.10 中的 PySide2 开发一个 GUI 窗口(不是我的选择)。运行示例代码时,backend_qt 包中会产生错误,该包用于在窗口中嵌入 matplotlib 图。这在这个程序中不是一个大问题,但是当它与项目的其余部分一起实施时,我相信它会导致窗口崩溃和/或无法正确显示

import sys
from matplotlib import pyplot as plt
from PySide2.QtWidgets import (QHBoxLayout, QWidget, QApplication)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg

class MplCanvas(FigureCanvasQTAgg):
    # Create canavs to display graph
    def __init__(self, parent, width=15, height=4, dpi=100):
        fig, self.axis = plt.subplots(figsize=(width, height), dpi=dpi)
        super().__init__(fig)
        self.setParent(parent)
        self.window = FigureCanvasQTAgg

class OutputWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.chart = MplCanvas(self)
        self.create_params_box()

    def create_params_box(self):

        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.chart)

app = QApplication(sys.argv)
demo = OutputWindow()
demo.setLayout(demo.hbox)
demo.showMaximized()
sys.exit(app.exec_())

输出

Traceback (most recent call last):
  File "~\venv\lib\site-packages\matplotlib\backends\backend_qt.py", line 276, in showEvent
    window.screenChanged.connect(self._update_screen)
AttributeError: 'NoneType' object has no attribute 'screenChanged'

来自后端_qt

    def showEvent(self, event):

        window = self.window().windowHandle()
        window.screenChanged.connect(self._update_screen)
        self._update_screen(window.screen())

显然这意味着

self.window().windowHandle()
返回 None 但我不确定为什么会这样。这会输出 2 次,一次是在窗口打开时,另一次是在用户关闭窗口时

我不确定这是我的问题还是 PySide2 的问题(这不是第一个),但我希望有一个解决方法。

谢谢!

剥离原始代码以进行演示 将 PySide2 版本更改为 5.15.2、5.15.1、5.14.x 示例代码产生正常输出,但在完整系统中实施时窗口崩溃

python qt matplotlib pyqt pyside2
1个回答
0
投票

您错误地嵌入了 Matplotlib 画布。参见官方文档

喜欢以下基于您的示例的示例。

from matplotlib import pyplot as plt
from PySide2.QtWidgets import (QHBoxLayout, QWidget, QApplication)
from matplotlib.backends.backend_qtagg import FigureCanvas

class MplCanvas(FigureCanvas):
    def __init__(self, width=15, height=4, dpi=100):
        fig, self.axis = plt.subplots(figsize=(width, height), dpi=dpi)
        super().__init__(fig)

class OutputWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.chart = MplCanvas()
        hbox = QHBoxLayout()
        self.setLayout(hbox)
        hbox.addWidget(self.chart)

app = QApplication()
demo = OutputWindow()
demo.show()
app.exec_()
© www.soinside.com 2019 - 2024. All rights reserved.