Dialogos en PyQt con QMessageBox - Python

Caja de diálogos en PyQt con QMessageBox
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

PyQt con QMessageBox - Acerca de
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

PyQt con QMessageBox - Información
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

PyQt con QMessageBox - Advertencia
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

PyQt con QMessageBox - Diálogo crítico
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

PyQt con QMessageBox - Pregunta
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

PyQt con QMessageBox - 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

PyQt con QMessageBox - Confirmació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

  1. Unknown dice:

    Muchas gracias Diego por tus aportes. Vengo de otros lenguajes y estos ejemplos me vienen muy bien para actualizarme en Python.

    1. PythonDiario dice:

      Hola Andres, me alegra te sean de ayuda las entradas. Todos a aprendemos compartiendo 🙂 . Saludos

  2. Unknown dice:

    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

    1. PythonDiario dice:

      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 😉

    2. Unknown dice:

      buen dia Diego, para los mensajes personalizados hay alguna manera de integrar el icono como por ejemplo el de informacion, critical, warning. gracias

    3. PythonDiario dice:

      Te refieres a las imagenes que aparecen a la izquierda del mensaje?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey