在使用 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 无法构建