Problema con ventanas y servicios

Chema Cortes pych3m4 en gmail.com
Mie Dic 5 10:49:03 CET 2007


El 29/11/07, luis orellana orihuela <lova_luis en hotmail.com> escribió:

> A tu pregunta ... Sí, uso hilos. Cada vez que acepto un socket lo paso a un hilo para que lo procese. Además,  una vez que tomo la cadena del cliente la paso a otro hilo para que lo muestre por pantalla, pero el problema persiste . Pego aquí parte del código:
>
> def procesa(conexion):                          #un hilo por cada conexion aceptada
>     texto=conexion.recv(1024)
>     conexion.close()
>     thread.start_new(ventana,(texto,))        #un hilo por ventana para evitar q se quede 'colgado'
>
> def ventana(texto):
>     #preparamos ventana que muestre el texto  ---------------
>     ventana = Label(None,text=texto)
>     ventana.pack()
>
>     #boton = Button(form,text="Aceptar",command=form.destroy)
>     #boton.pack(side="bottom")
>     ventana.mainloop()
>     #-------------------------------------------------------------------------

Tkinter no es "thread-safe". Es muy arriesgado intentar pasar
información entre hilos tal como estás haciendo. Lo extraño es que no
te haya dado algún error fatal de ejecución. Cada mainloop que
ejecutas captura el control de los eventos, por lo que el resto de
hilos no responde (que es el efecto que notas).

El modo de operar que te aconsejo sería tener un único bucle
"mainloop" en el thread principal, y crear desde éste el resto de
hilos que controlen los sockets. Si no te va bien que tkinter esté en
el hilo principal, pásalo a uno secundario, pero haz que todas las
llamadas a tkinter se hagan en ése hilo. La comunicación entre hilos
se puede hacer mediante objetos Queue (mira la documentación de
python).

Para crear nuevas ventanas usa Toplevel. Si no quieres ver la ventana
principal de tkinter la puedes ocultar con withdraw.
_______________________________________________
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