调试pyQT4应用程序?

2024-05-14 15:09:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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,我无法输入任何内容。有更好的办法吗?


Tags: the函数app应用程序signalisthiswhere
2条回答

你需要打电话给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中的时候,然后在你点击enter之后,控制台出现垃圾邮件,继续点击'c'(继续)直到应用程序恢复正常。(由于某种原因,我不得不打了几次'c',它一直回到pdb,但打了几次之后,它恢复正常)

有关更多信息,请访问Google“pyqtRemoveInputHook pdb”。(很明显不是吗?;页)

我必须在跟踪点使用“next”命令才能首先脱离该函数。为此,我修改了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) - Queueing up commands to execute

相关问题 更多 >

    热门问题