我正在使用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
导致崩溃。但是我不知道为什么,这让我感到好奇,所以我需要一个解释。
答案 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"))