在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”

Posted

技术标签:

【中文标题】在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”【英文标题】:"event loop is already running" while using the pdb debugger in an application running with matplotlib and PySide2 【发布时间】:2021-07-22 07:03:12 【问题描述】:

我有一个应用程序,用户必须使用 matplotlib 单击图像。我想使用调试器pdb(第 53 行),但是,当我启动应用程序并单击按钮时,会出现一条消息

QCoreApplication::exec: The event loop is already running

出现并阻止我使用调试器。我怀疑它来自以下几行,但我不确定

import matplotlib
try:
    matplotlib.rcParams['backend.qt5'] = 'PySide2'
except (KeyError, Exception):
    pass
matplotlib.use('Qt5Agg')

感谢我从之前提出的这个问题中得到的答案,我确实实现了这些行: Same code with PyQT5/PySide2 runs on MacOS but throws an error on Linux

如何在后端保留相同的代码结构并能够使用 pdb 调试器?

import sys
import os 
import subprocess
from subprocess import call
import matplotlib
import pdb

try:
    matplotlib.rcParams['backend.qt5'] = 'PySide2'
except (KeyError, Exception):
    pass
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt


from PySide2 import QtGui
from PySide2 import QtCore
from PySide2.QtWidgets import QWidget, QApplication, QPushButton, QFileDialog
from PySide2.QtCore import QFile, QTextStream

os.environ['QT_MAC_WANTS_LAYER'] = '1'


from IPython.core import ultratb
import pdb

sys.excepthook = ultratb.FormattedTB(mode='Verbose', color_scheme='Linux', call_pdb=True)


class GUI(QWidget):
    def __init__(self):
        super(GUI, self).__init__()

        self.initUI()

    def initUI(self):

        height_btn = 40 
        width_btn = 350
        
        button_position_x = 0
        button_position_y = 20 

        button_position_x = button_position_x = 0
        button_position_y = button_position_y + 400
        btn15 = QPushButton('button', self)     
        btn15.clicked.connect(self.Plotfunction)
        btn15.resize(width_btn, height_btn)
        btn15.move(button_position_y, button_position_x)       
        self.show()

    def Plotfunction(self):
        pdb.set_trace()
        print("ok")


def main():

    app = QApplication(sys.argv)
    ex = GUI()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

尝试在matplotlib 导入之前移动PySide2 导入 再次感谢@eyllanesc!这解决了问题脚本的问题。然而,在主应用程序中,问题仍然存在。我必须进一步挖掘并接近问题 【参考方案1】:

默认情况下,matplotlib 将加载已经导入的绑定(PyQt 或 PySide2),或者如果没有加载,它会尝试导入它们,并且第一个设法导入它的将使用它。显然,在 OP 的情况下,它首先导入 PyQt 导致该问题。解决方案是先导入 PySide2,然后再导入 matplotlib,这样它就更喜欢 PySide2 作为后端绑定。

【讨论】:

以上是关于在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PySide2 在 matplotlib 中显示图形?

在使用 matplotlib 和 PySide2 运行的应用程序中使用 pdb 调试器时出现“事件循环已在运行”

在 Pyside2 中嵌入 Matplotlib 的释放错误

由于 PySide2 和 Matplotlib,Travis-CI 无法构建

在同一进程中将 matplotlib 与 Qt5 后端一起使用并运行现有 QApplication

Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件