调试pyQT4应用程序?
我有一个用pyqt4做的比较简单的应用程序。我想调试一个和按钮连接的函数。但是,当我这样做的时候
python -m pdb app.pyw
> break app.pyw:55 # This is where the signal handling function starts.
事情并没有像我希望的那样进行。它没有在我设置的断点处停下来让我逐步查看,而是进入了一个无限循环,不停地打印出 QCoreApplication::exec: The event loop is already running
,我也无法输入任何东西。有没有更好的方法来解决这个问题?
3 个回答
0
在我的测试中,jamk的解决方案有效,而之前那个虽然简单,但并不好用。
在某些情况下,出于我不太明白的原因,我能够在不做任何这些操作的情况下调试Qt。
6
我需要在调试的某个点使用一个“下一步”的命令,先跳出那个函数。为此,我对mgrandi的代码做了一些修改:
def pyqt_set_trace():
'''Set a tracepoint in the Python debugger that works with Qt'''
from PyQt4.QtCore import pyqtRemoveInputHook
import pdb
import sys
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 the user invoked `pyqt_set_trace()`
debugger.interaction(users_frame, None)
这样做对我有效。我是在这里找到这个解决方案的: Python (pdb) - 排队等待执行的命令
97
你需要调用 QtCore.pyqtRemoveInputHook。我把它封装在我自己版本的 set_trace
里面:
def debug_trace():
'''Set a tracepoint in the Python debugger that works with Qt'''
from PyQt4.QtCore import pyqtRemoveInputHook
# Or for Qt5
#from PyQt5.QtCore import pyqtRemoveInputHook
from pdb import set_trace
pyqtRemoveInputHook()
set_trace()
当你调试完毕后,可以调用 QtCore.pyqtRestoreInputHook()
,最好是在你还在 pdb 的时候。然后在你按下回车后,如果控制台出现很多信息,继续按 'c'(代表继续),直到应用程序正常恢复。 (出于某种原因,我需要按 'c' 好几次,它总是回到 pdb,但按几次后就恢复正常了)
想了解更多信息,可以去谷歌搜索 "pyqtRemoveInputHook pdb"。(这不是很明显吗?;P)