Problema con ventana
Gabriel Genellina
gagsl-py2 en yahoo.com.ar
Jue Dic 13 17:56:02 CET 2007
En Wed, 12 Dec 2007 05:51:43 -0300, Luis Orellana Orihuela
<luis.ore.ori en gmail.com> escribi�:
> Reanudo el hilo que llevaba en mi anterior cuenta:
>
> No me enrollo y simplifico. Tenemos esta aplicación:
>
> from Tkinter import *
> from tkMessageBox import showinfo
>
> form = Tk()
> form.withdraw()
> showinfo(title='Titulo ventana', message='hola mundo')
> print "llega??"
>
> ¿Hay alguna forma de que se ejecute la linea* print "llega??" *sin tener
> que
> esperar que se cierre o acepte la ventana showinfo? es decir, trato de
> que
> la aplicación siga su curso sin que se quede esperando un evento que
> interactúe con la ventana. El objetivo es mostrar el mensaje y seguir,
> sin
> necesidad de saber lo que se hace con la ventana. Gracias
Lo que estas buscando es una caja de dialogo no modal. Los dialogos
estandar (como showinfo) son modales (es decir, la aplicacion se queda
esperando la respuesta del usuario) porque a) es lo mas comun y b) es la
parte dificil de hacer.
Para mostrar un mensaje y continuar, simplemente se crea una ventana
adecuada (Toplevel) y ya esta.
Aca hay un ejemplo basado en tkSimpleDialog. Lo importante fue *quitar* la
llamada a widget.wait_window(window) que es la que inicia el loop de
mensajes local y lo hace modal.
# modelessdialog.py
#
# Soporte para dialogos no modales
# Gabriel Genellina
#
# Basado en tkSimpleDialog.py Copyright (c) 1997 by Fredrik Lundh
from Tkinter import *
class ModelessDialog(Toplevel):
def __init__(self, parent, title = None):
Toplevel.__init__(self, parent)
if parent.winfo_viewable():
self.transient(parent)
if title:
self.title(title)
self.parent = parent
body = Frame(self)
self.body(body)
body.pack(padx=5, pady=5)
self.buttonbox()
self.protocol("WM_DELETE_WINDOW", self.close)
if self.parent is not None:
self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
parent.winfo_rooty()+30))
def body(self, master):
# hook
pass
def buttonbox(self):
# hook; default=[OK]
box = Frame(self)
w = Button(box, text="OK", width=10, command=self.close,
default=ACTIVE)
w.pack(side=LEFT, padx=5, pady=5)
self.bind("<Return>", self.close)
box.pack()
def close(self, event=None):
if self.parent is not None:
self.parent.focus_set()
self.destroy()
class MessageDialog(ModelessDialog):
def __init__(self, parent, title=None, message=''):
self.message = message
ModelessDialog.__init__(self, parent, title)
def body(self, master):
w = Label(master, text=self.message, justify=LEFT)
w.grid(row=0, padx=5, sticky=W)
if __name__ == '__main__':
root = Tk()
frame = Frame(root)
def mostrar_mensajes(frame=frame):
MessageDialog(frame, 'Titulo de la ventana',
'Este es el texto '
'del mensaje. Puede ser bastante largo.\n'
'Tambien puede tener varias lineas')
MessageDialog(frame, 'Doblete',
'Claro, como no es modal, puede haber '
'varios MessageDialog simultaneamente.')
Button(frame, text='Test', command=mostrar_mensajes).pack(side=LEFT)
Button(frame, text='Fin', command=frame.quit).pack(side=LEFT)
frame.pack()
root.mainloop()
--
Gabriel Genellina
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es