【问题标题】:Debugging a PyQt application using PyDev+Eclipse使用 PyDev+Eclipse 调试 PyQt 应用程序
【发布时间】:2015-12-27 17:21:28
【问题描述】:

我经常在 Eclipse 中使用 PyDev 进行 Python 开发。但是,我是第一次在同一环境中尝试 PyQt。它运作良好,但有一个例外。如果程序在 Qt 主事件循环中的任何地方出错,包括在我自己的代码中,则不会向 PyDev 控制台输出任何错误信息。

为了证明这一点,我创建了以下简单的 PyQt 应用:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication

# test.ui contains a single Push Button named pushButton
base, form = uic.loadUiType("../ui/test.ui") 

class MainWindow(base, form):
    def __init__(self, parent=None):
        super(base, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.button_pressed)

    def button_pressed(self):
        print('button pressed')
        print(invalid_variable) # intentional error
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

如果我在if __name__ == '__main__': 之后和app.exec_() 命令之前的任何位置放置了诸如print(invalid_variable) 之类的故意错误,则程序会以回溯和预期的NameError: name 'invalid_variable' is not defined 正确终止。但是,如果我使用上面的代码在对话框中按下按钮,button pressed 会出现在控制台上,但是应用程序会静默终止,并且控制台中没有错误信息。其他调试操作,例如断点和表达式,都可以正常工作。

这是预期的行为吗?如果是这样,您建议在此环境中促进 PyQt 应用程序的调试。如果没有,我希望能深入了解我需要做些什么来纠正这个问题。

  • Python 版本:python-3.4.3.amd64
  • PyDev 版本:PyDev for Eclipse 4.3.0.201508182223
  • PyQt 版本:PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x64

更新2015-09-30

当我直接使用 python.exe 运行测试应用程序时,它在两种错误情况下都将错误正确输出到 stderr。所以这个问题似乎是 PyDev 环境特有的。我还创建了一个全新的 Eclipse 工作区,仅配置了 Python 解释器,并使用相同的源代码在新创建的 PyDev 项目上再次运行我的测试。结果是一样的。

【问题讨论】:

    标签: python eclipse qt pyqt pydev


    【解决方案1】:

    这是一个非常古老的问题,但我想我会提供答案,因为它出现在谷歌搜索这个问题上。

    问题是对 pyqt5.5+ 错误处理的更改,包括以下代码将在崩溃时重新启用堆栈跟踪。

    在互联网上进行了很多随机浏览,但最终找到了解决问题所需的代码,在此处发布以供遇到相同问题的其他人参考。当我终于找到它时很明显。 ;)

    from PyQt5 import QtCore
    import traceback, sys
    
    
    if QtCore.QT_VERSION >= 0x50501:
        def excepthook(type_, value, traceback_):
            traceback.print_exception(type_, value, traceback_)
            QtCore.qFatal('')
    sys.excepthook = excepthook
    

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我只添加了一行:

      import ipdb
      

      所以我所有的 QT 应用程序都显示错误。 ipdb - 这是用于调试脚本的模块,但没有任何设置(仅导入)它可以根据需要工作

      【讨论】:

        猜你喜欢
        • 2017-05-17
        • 2011-10-07
        • 2014-08-13
        • 2012-09-22
        • 2016-05-06
        • 2013-08-11
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        相关资源
        最近更新 更多