matplotlib在调试pyqt5应用程序时给出空图

tktrz96b  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(116)

我从Debugging a pyQT4 app?学到了如何避免
QCoreApplication::exec:事件循环已在运行
当运行PyQt 5应用程序并使用断点时。这对于打印到控制台来说很好,但是如果我想在那个断点运行matplotlib plt.show(),我仍然会遇到麻烦。然后我得到上面的消息,只是一个空的数字。
有什么办法克服吗?
已解决:将plt.show()替换为plt.pause(0.01)。谢谢你@Jared。
下面是一个完整的示例代码。断点是通过按下按钮触发的,我已经在断点下注解了我在控制台上键入的内容,以获得空图。

import sys

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

class MainWindow(QMainWindow):
    """Class main window."""

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

        self.setWindowTitle('test')
        self.widget = QWidget()

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

        self.btn = QPushButton('Push to breakpoint')
        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() / should be: plt.pause(0.01)

    def exit_app(self):
        """Exit app by menu."""
        sys.exit()

def prepare_debug():
    """Set a tracepoint in PDB that works with Qt."""
    # https://stackoverflow.com/questions/1736015/debugging-a-pyqt4-app
    from PyQt5.QtCore import pyqtRemoveInputHook
    import pdb
    pyqtRemoveInputHook()
    # set up the debugger
    debugger = pdb.Pdb()
    debugger.reset()
    # custom next to get outside of function scope
    debugger.do_next(None)  # run the next command
    users_frame = sys._getframe().f_back  # frame where user invoked `pyqt_set_trace()`
    debugger.interaction(users_frame, None)

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

z18hc3ub1#

在调试时,如果您想显示pyplot图,可以使用plt.pause(0.01)命令(时间并不重要)。根据documentation
如果有活动地物,则在暂停之前将更新并显示该地物,并且GUI事件循环(如果有)将在暂停期间运行。
如果您有兴趣了解pauseshow之间的区别,文档中包含了它们的源代码链接。为了方便起见,我在下面列出了这些链接。

  • 暂停源代码
  • 显示源代码

相关问题