Python PyQt5:如何使用PyQt5显示错误消息



在正常的Python (3.x)中,我们总是使用来自tkinter模块的showerror()来显示错误消息,但是我应该在PyQt5中做些什么来显示完全相同的消息类型?

不要忘记调用.exec_()来显示错误:

from PyQt5.QtWidgets import QMessageBox
msg = QMessageBox()
msg.setIcon(QMessageBox.Critical)
msg.setText("Error")
msg.setInformativeText('More information')
msg.setWindowTitle("Error")
msg.exec_()

Qt包含一个特定于错误消息的对话框类QErrorMessage,您应该使用它来确保您的对话框符合系统标准。要显示对话框,只需创建一个对话框对象,然后调用.showMessage()。例如:

error_dialog = QtWidgets.QErrorMessage()
error_dialog.showMessage('Oh no!')

下面是一个最小的工作示例脚本:

import PyQt5
from PyQt5 import QtWidgets
app = QtWidgets.QApplication([])
error_dialog = QtWidgets.QErrorMessage()
error_dialog.showMessage('Oh no!')
app.exec_()

假设您在一个QWidget中,您想要显示错误消息,您可以简单地使用QMessageBox.critical(self, "Title", "Message"),用另一个(例如主widget)替换self,如果您不是QWidget类。


编辑:即使你不是在一个QWidget(或不想从它继承),你可以使用None作为父与实例QMessageBox.critical(None, "Title", "Message")


编辑,下面是如何使用它的一个例子:

# -*-coding:utf-8 -*
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
# In this example, success is False by default, and
#  - If you press Cancel, it will ends with False,
#  - If you press Retry until i = 3, it will end with True

expectedVal = 3

def MyFunction(val: int) -> bool:
    return val == expectedVal

app = QApplication(sys.argv)
i = 1
success = MyFunction(i)
while not success:
    # Popup with several buttons, manage below depending on choice
    choice = QMessageBox.critical(None,
                                  "Error",
                                  "i ({}) is not expected val ({})".format(i, expectedVal),
                                  QMessageBox.Retry | QMessageBox.Cancel)
    if choice == QMessageBox.Retry:
        i += 1
        print("Retry with i = {}".format(i))
        success = MyFunction(i)
    else:
        print("Cancel")
        break
if success:
    # Standard popup with only OK button
    QMessageBox.information(None, "Result", "Success is {}".format(success))
else:
    # Standard popup with only OK button
    QMessageBox.critical(None, "Result", "Success is {}".format(success))

以上所有选项都不适合我使用Komodo Edit 11.0。刚刚返回"1"或者如果没有实现"-1073741819"。

对我有用的是:Vanloc的解决方案。

def my_exception_hook(exctype, value, traceback):
    # Print the error and traceback
    print(exctype, value, traceback)
    # Call the normal Exception hook after
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)
# Back up the reference to the exceptionhook
sys._excepthook = sys.excepthook
# Set the exception hook to our wrapping function
sys.excepthook = my_exception_hook

要显示消息框,可以调用这个def:

from PyQt5.QtWidgets import QMessageBox, QWidget
MainClass(QWidget):
    def __init__(self):
        super().__init__()
    def clickMethod(self):
        QMessageBox.about(self, "Title", "Message")

下面应该可以工作:

msg = QMessageBox()
msg.setIcon(QMessageBox.Critical)
msg.setText("Error")
msg.setInformativeText(e)
msg.setWindowTitle("Error")

它不是完全相同的消息类型(不同的GUI),但相当接近。e是python3

中Error的表达式

希望有帮助,Narusan

import sys
from PyQt5.QtWidgets import QMessageBox
import PyQt5
from PyQt5 import QtWidgets
"""
Stadard button
QMessageBox.Ok
QMessageBox.Open
QMessageBox.Save
QMessageBox.Cancel
QMessageBox.Close
QMessageBox.Yes
QMessageBox.No
QMessageBox.Abort
QMessageBox.Retry
QMessageBox.Ignore
"""
class MessageBox(QMessageBox):
    def __init__(self, parent=None):
        super().__init__(parent)
        
    #showinfo    
    def showinfo(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        
        self.setIcon(QMessageBox.Information)
        self.standard_button=QMessageBox.Ok
        self.setStandardButtons(self.standard_button)
        return self.execute()

    #showwarning
    def showwarning(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Warning)
        self.standard_button=QMessageBox.Ok
        self.setStandardButtons(self.standard_button)
        return self.execute()

    #showerror
    def showerror(self,title,text):
        
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Critical)
        self.standard_button=QMessageBox.Ok
        self.setStandardButtons(self.standard_button)
        return self.execute()
       

    #askyesno
    def askyesno(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Question)
        self.standard_button=QMessageBox.Yes | QMessageBox.No
        self.setStandardButtons(self.standard_button)
        return self.execute()

    #askyesnocancel
    def askyesnocancel(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Question)
        self.standard_button=QMessageBox.Yes | QMessageBox.No| QMessageBox.Cancel
        self.setStandardButtons(self.standard_button)
        return self.execute()
    #asksave
    def asksave(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Question)
        self.standard_button=QMessageBox.Save | QMessageBox.No| QMessageBox.Cancel
        self.setStandardButtons(self.standard_button)
        return self.execute()
    #asksave
    def askopen(self,title,text):
        self.setWindowTitle(title)
        self.setText(text)
        self.setIcon(QMessageBox.Question)
        self.standard_button=QMessageBox.Open | QMessageBox.No
        self.setStandardButtons(self.standard_button)
        return self.execute()
    #execute
    def execute(self):
        self.exec_()
        msg_returned=str(self.clickedButton().text()).replace('&','')
        return msg_returned
    
#Test
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QListWidget, QVBoxLayout, QLineEdit,QPushButton

class Widget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Msgbox")
        self.layout=QVBoxLayout()
        self.button=QPushButton("show message box")
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
        self.button.clicked.connect(self.handle_text_changed)
        #messagebox 
        self.msgbox = MessageBox()
    def handle_text_changed(self):
            #res = self.msgbox.showinfo("Title","This is a text")
            #res = self.msgbox.showerror("Title","This is a text")  #askyesnocancel
            #res = self.msgbox.askyesnocancel("Title","This is a text")
            #res = self.msgbox.askyesno("Title","This is a text")
            #res = self.msgbox.showwarning("Title","This is a text")  
            #res = self.msgbox.showerror("Title","This is a text")  
            #res = self.msgbox.asksave("Title","This is a text")  
            #res = self.msgbox.askopen("Title","This is a text")  
            res = self.msgbox.showinfo("Title","This is a text")  
            print(res)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainwindow = Widget()
    mainwindow.show()
    sys.exit(app.exec_())
    
    
`

最新更新