diálogo de información no bloqueante en Tkinter
Necesito un cuadro de información simple para mostrar algún resultado de estado, que alternativamente volcaría en la consola usandoprint
. La posibilidad más fácil que encontré es la siguiente:
import Tkinter as tk
root = tk.Tk()
root.withdraw()
from tkMessageBox import showinfo
showinfo('some caption', 'some info')
El único problema con esta implementación es que mi programa (no escrito en tkinter) no continuará ejecutándose, hasta que el botón "Aceptar" de lashowinfo
Se presiona el cuadro de mensaje. Eso es elshowinfo
se bloqueará el diálogo.
Por lo tanto mi pregunta: ¿Hay una forma sencilla de hacershowinfo
no bloqueante? ¿Existen implementaciones alternativas de mensajes en Tkinter que no sean de bloqueo? Puedo pensar en el uso típico de la jaula de mostrar una página de ayuda: la ventana debería abrirse y el programa principal sigue funcionando normalmente.
EDIT1: He aquí una ventana de ayuda simple que se me ocurrió, pero desafortunadamente no se muestra, a menos que lance un diferentetkMessageBox
o un objeto similar:
class TextInfo(object):
def __init__(self, parent, window_title = 'window', textfield = 'a text field', label = None):
self.top = tk.Toplevel(parent)
self.parent = parent
self.window_title = window_title
self.textfield = textfield
# set window title
if window_title:
self.top.title(window_title)
# add label if given
if label:
tk.Label(self.top, text=window_title).grid(row=0)
# create the text field
self.textField = tk.Text(self.top, width=80, height=20, wrap=tk.NONE)
if textfield:
self.textField.insert(1.0, textfield)
self.textField.grid(row=1)
# create the ok button
b = tk.Button(self.top, text="OK", command=self.ok)
b.grid(row=2)
def ok(self):
self.top.destroy()
Y así es como llamo a la ventana:
root = tk.Tk()
root.withdraw()
TextInfo(self.root, window_title, textfield, label)
# don't call root.mainloop() here, because this will lead to blocking.
¿Hay algún tipo de propiedad o evento que deba configurar para que aparezca la ventana? Si llamoroot.mainloop()
Aparecerá la ventana, pero luego mi GUI se bloqueará de nuevo.