调试pyQT4应用程序?

52 投票
3 回答
15834 浏览
提问于 2025-04-15 16:01

我有一个用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)

撰写回答