PyQt5:程序崩溃了,没有显示更多的错误信息?

PyQt5: The program was crashed and don't show further error information?

我正在使用 PyQt5,我创建了一个带有 QpushButton 的 QWidgets,然后使用名为 show_message() 的函数连接按钮。当我单击按钮时,程序无法按预期运行并崩溃并显示以下消息:进程已完成,退出代码为 -1073741819 (0xC0000005),并且没有进一步的错误信息。我也尝试使用 sys.excepthook (访问 Logging uncaught exceptions in Python )来记录未捕获的异常,但结果是一样的。

这是我的代码:

from PyQt5.QtWidgets import QMessageBox, QApplication, QWidget
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import QPushButton
import sys


def foo(exctype, value, tb):
    print('My Error Information')
    print('Type:', exctype)
    print('Value:', value)
    print('Traceback:', tb)

sys.excepthook = foo


def show_message(title, info, icon_path='ac_solution.ico', type_=QMessageBox.Information):
    """ show message """
    app = QApplication([])
    message_box = QMessageBox()
    message_box.setText(info)
    message_box.setWindowTitle(title)
    message_box.setWindowIcon(QtGui.QIcon(icon_path))
    message_box.setIcon(type_)
    message_box.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
    message_box.activateWindow()
    message_box.show()
    app.exec_()


app = QApplication([])
Form = QtWidgets.QWidget(flags=QtCore.Qt.WindowStaysOnTopHint)
button = QPushButton('PyQt5 button', Form)
button.setToolTip('This is an example button')
button.move(100, 70)
button.clicked.connect(lambda: show_message("hahaha", "hehehe"))
Form.show()
try:
    app.exec_()
except:
    print("exiting")

当我删除行 app = QApplication([])app.exec_() 时,程序将运行良好,因此我可以猜测 show_message 中的 QApplication() 导致了崩溃。但是我不知道为什么,这让我很好奇,所以我需要一个解释。

您的代码存在两个主要问题。首先,您正在尝试 运行 show_messageQApplication 的第二个实例,这就是导致崩溃的原因。其次,message_boxshow_message 本地的,这意味着当 message_box 完成时,show_message 被销毁。解决此问题的一种方法是在函数外部创建消息框并将其作为输入参数提供,例如

def show_message(message_box, title, info, icon_path='ac_solution.ico', type_=QMessageBox.Information):
    """ show message """
    message_box.setText(info)
    message_box.setWindowTitle(title)
    message_box.setWindowIcon(QtGui.QIcon(icon_path))
    message_box.setIcon(type_)
    message_box.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
    message_box.activateWindow()
    message_box.show()

...

button.clicked.connect(lambda x, box = QMessageBox(): show_message(box, "hahaha", "hehehe"))