Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调试pyQT4应用程序?_Python_Qt_Pyqt4 - Fatal编程技术网

Python 调试pyQT4应用程序?

Python 调试pyQT4应用程序?,python,qt,pyqt4,Python,Qt,Pyqt4,我有一个用pyqt4构建的相当简单的应用程序。我想调试一个连接到我应用程序中一个按钮的函数。然而,当我做以下事情时 python -m pdb app.pyw > break app.pyw:55 # This is where the signal handling function starts. 事情不像我希望的那样顺利。调试器没有打断设置断点的函数并让我单步执行,而是进入一个无限循环,打印出QCoreApplication::exec:事件循环已经在运行,我无法输入任何内容。有

我有一个用pyqt4构建的相当简单的应用程序。我想调试一个连接到我应用程序中一个按钮的函数。然而,当我做以下事情时

python -m pdb app.pyw
> break app.pyw:55  # This is where the signal handling function starts.
事情不像我希望的那样顺利。调试器没有打断设置断点的函数并让我单步执行,而是进入一个无限循环,打印出
QCoreApplication::exec:事件循环已经在运行,我无法输入任何内容。有更好的方法吗?

您需要打电话。我将其包装在自己版本的
set\u 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.pyqtrerestoreinputhook()
,最好是在您仍在pdb中时,然后在按下enter键,并且控制台出现垃圾邮件后,继续按下“c”(继续),直到应用程序正常恢复。(由于某种原因,我不得不打了几次“c”,它一直回到pdb,但打了几次后,它恢复正常)

欲了解更多信息,请点击谷歌“pyqtRemoveInputHook pdb”。(真的很明显,不是吗?;P)

我必须在跟踪点使用“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)

这对我有用。我从这里找到了解决方案:

在我的测试中,jamk的解决方案是有效的,而前一个解决方案虽然简单,但不起作用


在某些情况下,由于我不清楚的原因,我能够在不做任何操作的情况下调试Qt。

只想知道,第55行有什么内容?是在哪里注册信号还是处理信号的函数?在本例中,这就是处理信号的函数。我认为这不是一个完整的答案,但您可以尝试ERIC作为Python和PyQt的GUI调试器:有用的答案,仅供参考,我发现它与PyQt4一起工作,但与PySide不起作用。