You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试PyQt5应用时Matplotlib调用plt.show()出现空图的解决办法

解决PyQt5断点调试时的事件循环错误及Matplotlib显示问题

在调试PyQt5应用并使用断点时,常会遇到QCoreApplication::exec: The event loop is already running错误。通过调整调试钩子的方法可解决控制台调试场景下的该问题,但在断点期间调用matplotlib的plt.show()时,仍会触发相同错误且显示空图,最终通过将plt.show()替换为plt.pause(0.01)解决了这一问题。

核心解决方案

1. 规避Qt与调试器的事件循环冲突

通过自定义调试准备函数,移除Qt的输入钩子,避免其与pdb调试器的事件循环产生冲突:

  • 调用pyqtRemoveInputHook()移除Qt默认的输入钩子,防止干扰pdb运行
  • 初始化pdb调试器并调整执行上下文,确保调试器能正确接管程序流程

2. 解决断点内Matplotlib显示异常

plt.show()会启动独立的事件循环,与Qt主事件循环冲突导致报错,替换为plt.pause(0.01)即可正常渲染图像,同时避免事件循环冲突。

完整示例代码

import sys

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QHBoxLayout, QPushButton, QLabel
)

class MainWindow(QMainWindow):
    """主窗口类"""

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

        self.setWindowTitle('测试窗口')
        self.widget = QWidget()

        box = QHBoxLayout()
        self.widget.setLayout(box)
        self.lbl = QLabel('Hello')
        box.addWidget(self.lbl)

        self.btn = QPushButton('触发断点')
        box.addWidget(self.btn)
        self.btn.clicked.connect(self.run_script1)

        self.setCentralWidget(self.widget)

    def run_script1(self):
        breakpoint()
        import matplotlib.pyplot as plt
        plt.plot([1,2,3])
        # 替换plt.show()为以下代码
        plt.pause(0.01)

    def exit_app(self):
        """退出应用"""
        sys.exit()

def prepare_debug():
    """配置适配Qt的pdb断点"""
    from PyQt5.QtCore import pyqtRemoveInputHook
    import pdb
    pyqtRemoveInputHook()
    # 初始化调试器
    debugger = pdb.Pdb()
    debugger.reset()
    # 调整执行上下文以跳出当前函数作用域
    debugger.do_next(None)
    users_frame = sys._getframe().f_back
    debugger.interaction(users_frame, None)

if __name__ == '__main__':
    prepare_debug()
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec()

内容的提问来源于stack exchange,提问作者EllenWasbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:37:21