调试pyQT4应用程序?

Pau*_*cks 42 python qt pyqt4

我有一个使用pyqt4构建的相当简单的应用程序.我想调试连接到我的应用程序中的一个按钮的其中一个功能.但是,当我做以下事情时

python -m pdb app.pyw
> break app.pyw:55  # This is where the signal handling function starts.
Run Code Online (Sandbox Code Playgroud)

事情并不像我希望的那样有效.而不是打破我设置断点并让我单步执行的函数,调试器进入无限循环打印输出QCoreApplication::exec: The event loop is already running,我无法输入任何内容.有一个更好的方法吗?

qua*_*ark 83

您需要调用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()
Run Code Online (Sandbox Code Playgroud)

当你完成调试时,你可以打电话QtCore.pyqtRestoreInputHook(),最好是当你还在pdb中,然后在你输入后,控制台垃圾邮件正在发生,继续点击"c"(继续),直到应用程序恢复正常.(由于某些原因,我不得不多次点击'c',它一直回到pdb,但是在击中它几次后它恢复正常)

有关详细信息,请访问Google"pyqtRemoveInputHook pdb".(真的很明显不是吗?; P)

  • 有用的答案,仅供参考我发现这适用于PyQt4,但不适用于PySide. (5认同)

jam*_*amk 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)
Run Code Online (Sandbox Code Playgroud)

这对我有用。我从这里找到了解决方案:Python (pdb) -排队要执行的命令