【问题标题】:Recursion Error using pyqtgraph with PySide6在 PySide6 中使用 pyqtgraph 的递归错误
【发布时间】:2022-12-16 23:08:41
【问题描述】:

我在使用 PySide6 实现 pyqtgraph 时遇到问题。我已经将 pyqtgraph 与 PyQt5 一起使用,但我正在 PySide6 中专门为一个新项目制作一个新应用程序。

我检查了 pyqtgraph 文档,它说在 pyqtgraph 之前导入你的 Qt 包装器,这样它就知道要使用哪个。

import sys
from PySide6.QtWidgets import QMainWindow, QApplication, QTabWidget

from gui_scripts.tab_plot import PlotTab
import PySide6
import pyqtgraph as pg

from __feature__ import snake_case, true_property


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.graph_widget = pg.PlotWidget()
        self.set_central_widget(self.graph_widget)
        hour = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]
        self.graph_widget.plot(hour, temperature)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    main_window = MainWindow()
    main_window.show()

    sys.exit(app.exec())

我在 self.graph_widget = pg.PlotWidget() 处触发了“RecursionError: maximum recursion depth exceeded while calling a Python object”

我使用此示例 https://www.pythonguis.com/tutorials/pyside-plotting-pyqtgraph/ 生成了相同的错误,因为我的实际实现是跨几个脚本的。该应用程序有一个导航选项卡,可以在几个界面之间切换,其中一个是绘图,在我为绘图添加选项卡之前,代码工作得很好。

编辑: 当我不从 tab_plot 导入类时,代码很好。那个脚本是

from PySide6.QtWidgets import QWidget, QGridLayout
import sys
import pyqtgraph as pg

from __feature__ import snake_case, true_property


class PlotTab(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self)
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')

        self.parent = parent

        self.layout = QGridLayout(self)
        self.plot1 = pg.PlotWidget()
        self.plot1.setLabel('left', 'Temperature (K)')
        self.plot1.setLabel('bottom', 'Voltage (V)')
        self.layout.add_widget(self.plot1, 0, 0)

编辑2: 这是发生在以下位置的错误: self.plot1 = pg.PlotWidget() 文件“..\Python\Python310\lib\site-packages\pyqtgraph\widgets\PlotWidget.py”,第 51 行,在在里面图形视图。在里面(自我,父母,背景=背景)

文件“..\Python\Python310\lib\site-packages\pyqtgraph\widgets\GraphicsView.py”,第 73 行,在在里面self.useOpenGL(使用OpenGL)

文件“..\Python\Python310\lib\site-packages\pyqtgraph\widgets\GraphicsView.py”,第 168 行,使用 OpenGL self.setViewport(v)

文件“..\Python\Python310\lib\site-packages\pyqtgraph\widgets\PlotWidget.py”,第 78 行,在获取属性如果 hasattr(self.plotItem, attr):

文件 ..\Python\Python310\lib\site-packages\pyqtgraph\widgets\PlotWidget.py",第 78 行,在获取属性如果 hasattr(self.plotItem, attr):

文件“..\Python\Python310\lib\site-packages\pyqtgraph\widgets\PlotWidget.py”,第 78 行,在获取属性如果 hasattr(self.plotItem, attr): [上一行重复了 988 次] RecursionError:调用 Python 对象时超出最大递归深度

进程结束,退出代码为 1

【问题讨论】:

  • 为了澄清,如果我删除 snake_case 功能,并将方法重命名为 camelCase,我会得到同样的错误。
  • 是上面的代码确切地你正在运行的脚本?努力做到完全地最小:删除 plot() 行和不必要的导入。此外,尝试在终端或提示中运行该程序以获得更有用的回溯。
  • @musicamante 当我删除“from gui_scripts.tab_plot import PlotTab”行时,它会自行更正,但错误被声明在 MainWindow 中创建绘图小部件的行中。这很令人困惑
  • 我想我可能需要重新制作整篇文章
  • 请记住这一点以备将来参考,因为这是创建 MRE 几乎总是强制性的众多原因之一。如果您试图使代码尽可能少,您可能已经自己找到了问题的根源。

标签: python pyqtgraph pyside6


【解决方案1】:

好吧,我明白了。 pyqtgraph 与 PySide6 的 snake_case 特性不兼容。我认为删除它没有影响,但它仍在导入正在使用它的脚本。

【讨论】:

  • 我有一个(但我知道我并不孤单)总是反对 snake_case 特性(在某种程度上,= 属性),因为我觉得它非常不一致、令人困惑并且容易出现错误和问题。我们会定期看到一些问题或错误因此而出现,我真诚地希望他们迟早会最终放弃这种完全不必要的可憎行为,因为绝对没有人(在他们的正确思想中)真正需要或会问,绝对有足够好的原因(包括 PEP8)。
【解决方案2】:

我想你在def __init__(self):之后需要super(MainWindow, self).__init__()

像这样对我来说很好用

#!/usr/bin/env python3
from PySide6.QtWidgets import QApplication, QMainWindow
import pyqtgraph as pg
import sys


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.graphWidget = pg.PlotWidget()
        self.setCentralWidget(self.graphWidget)

        hour = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        temperature = [30, 32, 34, 32, 33, 31, 29, 32, 35, 45]

        # plot data: x, y values
        self.graphWidget.plot(hour, temperature)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec()

【讨论】:

  • 感谢您的回复,但 QMainWindow.__init__(self) 完成了同样的事情。我只是用你的台词来确认,但它引发了同样的错误。
  • 我相信递归错误与这部分代码无关,而是与它调用的数据有关。你能分享一个为图表提供数据的代码示例吗?您可以使用 print(sys(getrecursionlimit()) 检查您的递归限制,如果我对这种递归的发生方式有一些了解,我们可能可以通过循环避免递归。
  • 与此发生相同的错误。我会用确切的错误编辑帖子
  • 仍然没有足够的信息来提供帮助,我很抱歉。如果它不是调用数据的递归,那么它可能是来自两个脚本的无限循环的递归错误,这两个脚本试图做同样的事情或调用循环回自身的东西?对不起,我希望我能提供更多帮助。
【解决方案3】:

我遇到了同样的问题并找到了答案:update your pyqtgraph's version

【讨论】:

    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 2018-10-13
    • 2022-06-23
    • 2022-08-16
    • 2018-12-15
    • 2016-03-30
    • 2023-03-13
    • 2016-06-05
    相关资源
    最近更新 更多