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