Dialogos en PyQt con QMessageBox - Python
Caja de diálogos en PyQt |
En esta entrada veremos como interactuar con cajas de diálogos utilizando QMessageBox en PyQt. Ya hace algún un tiempo hice una entrada similar sobre Diálogos en Tkinter.
La clase QMessageBox ofrece cuadros de diálogos con un breve mensaje, un icono y botones dependiendo de su funcionalidad. Los cuadros de diálogos se utilizan para dar mensajes con información simple.
Lo que haremos será crear una ventana con varios botones, que contendrán los diálogos más utilizados por las aplicaciones.
Pare eso, crearemos un New Form en QtDesigner y le daremos la forma de la primera imagen.
Para interactuar en el código con los botones le di los siguientes nombres:
- Acerca de - About (btn_About)
- Información - Information (btn_Info)
- Advertencia - Warning (btn_Warning)
- Critico - Critical (btn_Critical)
- Pregunta - Question (btn_Question)
- Botones personalizados - Custom buttons (btn_Cb)
Guardamos el archivo .ui de Designer con el nombre Diálogos.ui
Creamos un archivo Diálogos.py con lo siguiente:
QMessageBox en PyQt para crear Diálogos
Código:
#!/usr/bin/python # -*- coding: utf-8 -*- # Pruebas con dialogos en PyQt # www.pythondiario.com import sys from PyQt4 import QtCore, QtGui, uic # Cargar nuestro archivo .ui form_class = uic.loadUiType("/home/diego123/Escritorio/Dialogos PyQt/Dialogos.ui")[0] class MyWindowClass(QtGui.QMainWindow, form_class): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.setupUi(self) self.btn_About.clicked.connect(self.btn_About_clicked) self.btn_Info.clicked.connect(self.btn_Info_clicked) self.btn_Question.clicked.connect(self.btn_Question_clicked) self.btn_Warning.clicked.connect(self.btn_Warning_clicked) self.btn_Critical.clicked.connect(self.btn_Critical_clicked) self.btn_Cb.clicked.connect(self.btn_Cb_clicked) def btn_About_clicked(self): # QMessageBox.about (QWidget parent, QString caption, QString text) QtGui.QMessageBox.about(self, "Acerca de", """www.pythondiario.com Este texto acepta formato HTML negrita""") def btn_Info_clicked(self): # QMessageBox.information (QWidget parent, QString caption, QString text, # int button0, int button1 = 0, int button2 = 0) QtGui.QMessageBox.information(self, "Informacion", """Esta es la informacion del mensaje""", QtGui.QMessageBox.Ok) def btn_Warning_clicked(self): ret = QtGui.QMessageBox.warning(self, "Advertencia", '''El documento ha sido modificado.n Quieres guardar los cambios?''', QtGui.QMessageBox.Save, QtGui.QMessageBox.Discard, QtGui.QMessageBox.Cancel); print "Answer: %s" % ret def btn_Critical_clicked(self): # StandardButton QMessageBox.critical (QWidget parent, QString title, # QString text, StandardButtons buttons = QMessageBox.Ok, StandardButton # defaultButton = QMessageBox.NoButton) ret = QtGui.QMessageBox.critical(self, "Critico", '''Critico! creo que hay un VIRUS!!! Muajajaja ''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel) if ret == QtGui.QMessageBox.Ok: QtGui.QMessageBox.information(self, 'Informacion', '''Usted presiono OK''', QtGui.QMessageBox.Ok) else: QtGui.QMessageBox.information(self, 'Informacion', '''Usted presiono Cancel''', QtGui.QMessageBox.Ok) def btn_Question_clicked(self): # int QMessageBox.question (QWidget parent, QString caption, QString text, # int button0, int button1 = 0, int button2 = 0), # QMessageBox.Ok 0x00000400 An "OK" button defined with the AcceptRole. # QMessageBox.Open 0x00002000 A "Open" button defined with the AcceptRole. # QMessageBox.Save 0x00000800 A "Save" button defined with the AcceptRole. # QMessageBox.Cancel 0x00400000 A "Cancel" button defined with the RejectRole. # QMessageBox.Close 0x00200000 A "Close" button defined with the RejectRole. # QMessageBox.Discard 0x00800000 A "Discard" or "Don't Save" button, depending on the platform, defined with the DestructiveRole. # QMessageBox.Apply 0x02000000 An "Apply" button defined with the ApplyRole. # QMessageBox.Reset 0x04000000 A "Reset" button defined with the ResetRole. # QMessageBox.RestoreDefaults 0x08000000 A "Restore Defaults" button defined with the ResetRole. # QMessageBox.Help 0x01000000 A "Help" button defined with the HelpRole. # QMessageBox.SaveAll 0x00001000 A "Save All" button defined with the AcceptRole. # QMessageBox.Yes 0x00004000 A "Yes" button defined with the YesRole. # QMessageBox.YesToAll 0x00008000 A "Yes to All" button defined with the YesRole. # QMessageBox.No 0x00010000 A "No" button defined with the NoRole. # QMessageBox.NoToAll 0x00020000 A "No to All" button defined with the NoRole. # QMessageBox.Abort 0x00040000 An "Abort" button defined with the RejectRole. # QMessageBox.Retry 0x00080000 A "Retry" button defined with the AcceptRole. # QMessageBox.Ignore 0x00100000 An "Ignore" button defined with the AcceptRole. # QMessageBox.NoButton 0x00000000 An invalid button. QtGui.QMessageBox.question(self, 'Mensaje con pregunta', ''' Esta es una pregunta. Te gusta Python Diario? ''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Abort) def btn_Cb_clicked(self): msgBox = QtGui.QMessageBox() msgBox.setText('Quieres una pizza?') btnQS = QtGui.QPushButton('Si Gracias') msgBox.addButton(btnQS, QtGui.QMessageBox.YesRole) btnNo = QtGui.QPushButton('No Gracias') msgBox.addButton(btnNo, QtGui.QMessageBox.NoRole) ret = msgBox.exec_() def closeEvent(self,event): reply = QtGui.QMessageBox.question(self, "Mensaje", "Seguro quiere salir", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore() app = QtGui.QApplication(sys.argv) MyWindow = MyWindowClass(None) MyWindow.show() app.exec_()
Análisis de las funciones del código
Acerca de - QMessageBox.about
Diálogo - Acerca de |
def btn_About_clicked(self): # QMessageBox.about (QWidget parent, QString caption, QString text) QtGui.QMessageBox.about(self, "Acerca de", """www.pythondiario.com
Este texto acepta formato HTML negrita"""
La función btn_About_clicked, como pueden ver, muestra una ventana donde generalmente se visualizan los créditos, versiones y alguna otra información de la aplicación. Acepta HTML y su código es bastante sencillo.
Información - QMessageBox.information
Diálogo de Información |
def btn_Info_clicked(self): # QMessageBox.information (QWidget parent, QString caption, QString text, # int button0, int button1 = 0, int button2 = 0) QtGui.QMessageBox.information(self, "Informacion", """Esta es la informacion del mensaje""", QtGui.QMessageBox.Ok)
La función btn_Info_clicked, muestra una simple ventana como la que se ve en la imágen. Con esta ventana podremos informar algún suceso de nuestra aplicación. Su código es muy sencillo.
Advertencia - QMessageBox.warning
Diálogo de Advertencia |
def btn_Warning_clicked(self): ret = QtGui.QMessageBox.warning(self, "Advertencia", '''El documento ha sido modificado.n Quieres guardar los cambios?''', QtGui.QMessageBox.Save, QtGui.QMessageBox.Discard, QtGui.QMessageBox.Cancel); print "Answer: %s" % ret
La función btn_Warning_clicked, nos despliega un diálogo de advertencia. La respuesta es guardada en una variable que llamamos ret, que en nuestro ejemplo retorna un string con la respuesta elegida.
Crítico - QMessageBox.critical
Diálogo - Crítico |
def btn_Critical_clicked(self): # StandardButton QMessageBox.critical (QWidget parent, QString title, # QString text, StandardButtons buttons = QMessageBox.Ok, StandardButton # defaultButton = QMessageBox.NoButton) ret = QtGui.QMessageBox.critical(self, "Critico", '''Critico! creo que hay un VIRUS!!! Muajajaja ''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel) if ret == QtGui.QMessageBox.Ok: QtGui.QMessageBox.information(self, 'Informacion', '''Usted presiono OK''', QtGui.QMessageBox.Ok) else: QtGui.QMessageBox.information(self, 'Informacion', '''Usted presiono Cancel''', QtGui.QMessageBox.Ok)
La función btn_Critical_clicked, como muestra la imágen, nos retorna un cuadro de diálogos advirtiendo sobre algún evento crítico de la aplicación (no hagan caso a la imágen de mi ejemplo muajaja). También la respueta es guardada en una variable llamada ret (al elegir Ok o Cancel nos desplegará otro cuadro de diálogo).
Mensaje con pregunta - QMessageBox.question
Diálogo de Pregunta |
def btn_Question_clicked(self): # int QMessageBox.question (QWidget parent, QString caption, QString text, # int button0, int button1 = 0, int button2 = 0), # QMessageBox.Ok 0x00000400 An "OK" button defined with the AcceptRole. # QMessageBox.Open 0x00002000 A "Open" button defined with the AcceptRole. # QMessageBox.Save 0x00000800 A "Save" button defined with the AcceptRole. # QMessageBox.Cancel 0x00400000 A "Cancel" button defined with the RejectRole. # QMessageBox.Close 0x00200000 A "Close" button defined with the RejectRole. # QMessageBox.Discard 0x00800000 A "Discard" or "Don't Save" button, depending on the platform, defined with the DestructiveRole. # QMessageBox.Apply 0x02000000 An "Apply" button defined with the ApplyRole. # QMessageBox.Reset 0x04000000 A "Reset" button defined with the ResetRole. # QMessageBox.RestoreDefaults 0x08000000 A "Restore Defaults" button defined with the ResetRole. # QMessageBox.Help 0x01000000 A "Help" button defined with the HelpRole. # QMessageBox.SaveAll 0x00001000 A "Save All" button defined with the AcceptRole. # QMessageBox.Yes 0x00004000 A "Yes" button defined with the YesRole. # QMessageBox.YesToAll 0x00008000 A "Yes to All" button defined with the YesRole. # QMessageBox.No 0x00010000 A "No" button defined with the NoRole. # QMessageBox.NoToAll 0x00020000 A "No to All" button defined with the NoRole. # QMessageBox.Abort 0x00040000 An "Abort" button defined with the RejectRole. # QMessageBox.Retry 0x00080000 A "Retry" button defined with the AcceptRole. # QMessageBox.Ignore 0x00100000 An "Ignore" button defined with the AcceptRole. # QMessageBox.NoButton 0x00000000 An invalid button. QtGui.QMessageBox.question(self, 'Mensaje con pregunta', ''' Esta es una pregunta. Te gusta Python Diario? ''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Abort)
La función btn_Question_clicked, despliga un cuadro de diálogo haciendo una pregunta. En los comentarios de la función (#) se encuentran todas las variables posibles para crear en el cuadro de diálogo.
Botones personalizados
Diálogos Personalizados |
def btn_Cb_clicked(self): msgBox = QtGui.QMessageBox() msgBox.setText('Quieres una pizza?') btnQS = QtGui.QPushButton('Si Gracias') msgBox.addButton(btnQS, QtGui.QMessageBox.YesRole) btnNo = QtGui.QPushButton('No Gracias') msgBox.addButton(btnNo, QtGui.QMessageBox.NoRole) ret = msgBox.exec_()
En la función btn_Cb_clicked, se ve el modo de crear un simple cuadro de diálogo personalizado.
Confirmar para salir de la aplicación
Confirmando la retirada |
def closeEvent(self,event): reply = QtGui.QMessageBox.question(self, "Mensaje", "Seguro quiere salir", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
Por último, la función closeEvent, hará que al salir del programa, se despligue un cuadro de diálogo para que confirmemos si realmente queremos salir de la aplicación.
Fuente: http://www.lemonsoftware.eu/goodies/python:qmessagebox
----------------------------------------------------------------------------------------------------------------------------------------
Espero puedan utilizar los cuadros de diálogos en sus futuras aplicaciones gráficas.
Saludos
-
-
Hola Andres, me alegra te sean de ayuda las entradas. Todos a aprendemos compartiendo 🙂 . Saludos
-
-
saludos Diego, una pregunta, hay alguna manera de anteponer algun caracter para que acepte los acentos, por ejemplo, asigne Aplicación y al ejecutar el mensaje de dialogo me aparece ApliciA3n: QtGui.QMessageBox.question(self, "Salir de aqui ...", "Esta seguro de salir de la aplicación", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) gracias
-
Hola Celestino, se puede si. Coloca la letra (u) antes de las comillas del mensaje. El mensaje te quedaría así: u"Esta seguro de salir de la aplicación".
También asegúrate que tu script arranque con la codificación: # -*- coding: utf-8 -*-
Saludos 😉 -
buen dia Diego, para los mensajes personalizados hay alguna manera de integrar el icono como por ejemplo el de informacion, critical, warning. gracias
-
Te refieres a las imagenes que aparecen a la izquierda del mensaje?
-
Deja una respuesta
Muchas gracias Diego por tus aportes. Vengo de otros lenguajes y estos ejemplos me vienen muy bien para actualizarme en Python.