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

时间:2019-08-16 10:09:58

标签: python pyqt5 sys

我正在使用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_()时,程序将运行良好,因此我可以猜测QApplication()中的show_message导致崩溃。但是我不知道为什么,这让我感到好奇,所以我需要一个解释。

1 个答案:

答案 0 :(得分:0)

您的代码有两个主要问题。首先,您正在尝试在QApplication中运行show_message的第二个实例,这是导致崩溃的原因。其次,message_box对于show_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"))