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