diálogo de informações não bloqueantes no Tkinter
Eu preciso de uma caixa de informações simples para exibir alguma saída de status, que eu seria alternativamente despejo para o console usandoprint
. A possibilidade mais fácil que encontrei é a seguinte:
import Tkinter as tk
root = tk.Tk()
root.withdraw()
from tkMessageBox import showinfo
showinfo('some caption', 'some info')
O único problema com esta implementação é que o meu programa (não está escrito em Tkinter) não vai continuar a correr, até o botão 'ok' doshowinfo
messagebox é pressionado. Isto é, oshowinfo
a caixa de diálogo será bloqueada.
Portanto, minha pergunta: Existe uma maneira simples de fazershowinfo
não bloqueante? Existem implementações alternativas de messagebox no Tkinter que não são de bloqueio? Eu posso pensar no uso típico de mostrar uma página de ajuda - a janela deve abrir e o programa principal continua funcionando normalmente.
EDIT1: aqui está uma janela de ajuda simples que eu criei, mas infelizmente não aparece, a menos que eu lance umtkMessageBox
ou um objeto semelhante:
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()
E é assim que eu chamo a janela:
root = tk.Tk()
root.withdraw()
TextInfo(self.root, window_title, textfield, label)
# don't call root.mainloop() here, because this will lead to blocking.
Existe algum tipo de propriedade ou evento que eu preciso definir para a janela aparecer? Se eu ligarroot.mainloop()
a janela será exibida, mas minha GUI será bloqueada novamente.