Cuadros de diálogo (messagebox) en Tcl/Tk (tkinter)

Cuadros de diálogo (messagebox) en Tcl/Tk (tkinter)

Un cuadro de diálogo es una ventana con un título, un mensaje, un ícono y uno o más botones. Se emplea para informar al usuario sobre alguna cuestión o bien exhortarlo a tomar una decisión.

Las funciones para generar cuadros de diálogo en una aplicación de Tcl/Tk están definidas en el módulo tkinter.messagebox (tkMessageBox en Python 2), y son las siguientes:

  • showinfo()
  • showwarning()
  • showerror()
  • askquestion()
  • askyesno()
  • askokcancel()
  • askyesnocancel()
  • askretrycancel()

Todas reciben los argumentos message y title, que indican el mensaje y el título del cuadro de diálogo. Por ejemplo:

from tkinter import messagebox

messagebox.showinfo(message="Mensaje", title="Título")

Este código genera la siguiente ventana.

Cuadro de diálogo

Mientras el cuadro de diálogo está abierto, el resto de los controles (widgets) dentro de la ventana no responden a ningún evento (por ejemplo, presionar sobre un botón). Este comportamiento se conoce en la jerga del desarrollo aplicaciones de escritorio como modal.

El ícono desplegado por cada una de las funciones es provisto por el sistema operativo, aunque siempre en relación con el mensaje que pretende comunicar el cuadro. Por ejemplo, el ícono de showinfo() es por lo general azul o celeste e indica información; el de showwarning(), amarillo o naranja denotando advertencia; el de showerror(), rojo indicando error.

Lo mismo ocurre con los textos de los botones. En estas tres funciones, en la mayoría de los sistemas operativos el texto es «Aceptar» o su traducción correspondiente. El valor de retorno es siempre la cadena "ok", independientemente de si se presionó el botón o se cerró la ventana.

Las funciones de interrogación retornan True o False, según se haya presionado «Aceptar» o «Cancelar», o bien «Sí» o «No». Ejemplos:

# Retornan True o False.
print(messagebox.askyesno(message="¿Desea continuar?", title="Título"))
print(messagebox.askokcancel(message="¿Desea continuar?", title="Título"))
print(messagebox.askretrycancel(message="¿Desea reintentar?", title="Título"))

Cuadros de diálogo

En estas tres funciones, cerrar la ventana es similar a haber cancelado, por ende el resultado es en ambos casos False.

askquestion() es similar a askyesno(), pero el resultado es "yes" o "no". Estos son los valores retornados directamente de la librería Tk y no hay razón para usarlos en lugar de la primera función.

# Retorna "yes" o "no".
print(messagebox.askquestion(message="¿Desea continuar?", title="Título"))

Por último, askyesnocancel() despliega los botones «Sí», «No» y «Cancelar», y los valores de retorno posibles son True, False y None, respectivamente.

# Retorna True, False o None.
print(messagebox.askyesnocancel(message="¿Desea continuar?", title="Título"))

En este caso, cerrar la ventana retorna None, puesto que es el valor asociado con el botón de cancelación.

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

17 comentarios.

  1. Hola,
    Cómo haría para que si llega a un determinado tiempo recién muestre esas ventanas y dependiendo si elijo si o no, se ejecute una acción.

    por ejemplo, tu sesión está a punto de terminar, desear continuar
    Si es SI : el equipo continúa pero t contabiliza a partir de ahí el tiempo extendido y en caso sea NO, t muestre el mensaje, tienes 5 minutos para cerrar todo porque el equipo se apagará.

  2. Hola!
    ¿Éstas ventanas emergentes se pueden customizar?? Si es así, que propiedades tiene?.
    Ando leyendo la documentación de la página oficial de python, y en los parámetros de todos los métodos hay una que dice <>. Alguien me puede explicar a que hace referencia. Gracias

    • Recursos Python says:

      Hola. Si te referís al estilo (color, tipografía, etc.), entonces no, no se puede modificar ya que el cuadro de diálogo es provisto directamente por el sistema operativo. Deberás crear tu propio cuadro de diálogo usando ventanas secundarias.

      Saludos

  3. En un simpledialog.askfloat como hago para cambiar el mensaje de error?
    me refiero al mensaje que sale cuando se ingresa un valor no que no es un float

  4. Gracias , le hago una pregunta, si yo lo que quiero es quitarle esa ventana emergente , pero a travez de python como lo hago , es que estoy en web scraping

    Gracias

  5. Consulta,

    Desde la ventana principal abro la secundaria y en ella(2da) tengo una condicional para una entrada numérica, que si no se cumple se ejecute un «showinfo», pero cuando este mensaje sale se devuelve a la ventana principal
    Cómo puedo mantener la ventana secundaria después del «showinfo»?

    Gracias por la atención.

Deja una respuesta