我正在使用 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 示例代码产生正常输出,但在完整系统中实施时窗口崩溃
您错误地嵌入了 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_()