Lanzar procesos desde interfaz Tkinter
Marcos Sánchez Provencio
rapto en arrakis.es
Sab Jul 12 12:38:59 CEST 2003
Esto funciona en python2.2 y linux. Que me corrijan los tkinteros...
import threading, os
resultado=[]
class TareasConsecutivas(threading.Thread):
def run(self):
resultado.append('1')
os.system("find /etc -name '*.conf';sleep 3")
resultado.append('2')
os.system("find /etc -name '*.d';sleep 3")
resultado.append('FIN')
def actualizar():
while resultado:
nuevo=resultado.pop(0)
text.insert(Tkinter.END,'\n' + nuevo)
if nuevo == 'FIN':
return
root.after(500,actualizar)
tareas=TareasConsecutivas()
import Tkinter
root=Tkinter.Tk()
button=Tkinter.Button(root,text="Hola",command=tareas.start)
button.pack()
text=Tkinter.Text()
text.pack()
root.after(500,actualizar)
root.mainloop()
Ernesto Revilla wrote:
> Yo lo haría con threads y os.system algo como esto. No está probado.
>
> import threading
> class TareasConsecutivas(Thread):
> def run(self,...)
> os.system("bla")
> os.system("blabla")
>
> tareas=TareasConsecutivas()
>
> import Tkinter
> root=Tkinter.Tk()
> button=Tkinter.Button(root,"Hola",command=tareas.start)
>
> root.mainloop()
>
>
> Importante:!!!!!!
> Todos los elementos que creas en Tkinter lo tienes que crear desde la
> hebra (thread) principal, de lo contrario casca. Si quieres mostrar el
> progreso en alguna ventana, termómetro o lo que sea, tienes que
> comunicar la hebra secundaria con la principal mediante algún
> mecanismo (el objecto Queue viene muy bien para esto). Puedes utilizar
> el 'after' de Tkinter para programar tareas periódicas, es decir, cada
> x tiempo (ej. 100 ms) compruebas si hay algo en la cola para mostrarlo.
>
> erny
>
>
> ----- Original Message -----
> *From:* Gema Núñez Blázquez <mailto:gema_alf en yahoo.es>
> *To:* Python-es en aditel.org <mailto:Python-es en aditel.org>
> *Sent:* Friday, July 11, 2003 12:00 PM
> *Subject:* [Python-es] Lanzar procesos desde interfaz Tkinter
>
> Tengo que hacer un proceso en Python que tiene interfaz gráfica y
> me ha surgido un problema Explico en que consiste el proceso:
>
> Hay un bat que tiene una serie de comandos pero Jaime quiere que
> ese proceso sea más vistoso y vaya saliendo en una interfaz los
> pasos que va haciendo, por ejemplo
>
> Paso 1: ....
>
> Paso2: ....
>
> Bien, hasta ahi porque creo la interfaz y voy lanzando los
> distintos procesos con la orden os.spanwn(os.P_WAIT,...) de Python
> puesto que hasta que no finalize ese proceso no puedo continuar
> con el siguiente.
>
> Mi problema es que la ventana de la interfaz se queda bloqueada y
> hasta que no retorna del proceso que he lanzado no me deja
> interactuar con ella (no se refesca y se queda en negro como si
> lanzase el proceso en modal). La pregunta es: ¿lo estoy enfocando
> bien?¿Hay alguna forma para que aun estando ejecutando el proceso
> de DOS lanzado yo pueda retornar a mi ventana de python y pueda
> ver lo que hay escrito hasta el momento en ella?
>
> He probado con os.system(..) y tampoco, habia pensado en usar
> P_NOWAIT y espera a que finalice con os.waitpid o wait pero esas
> funciones solo valen en Unix y esto corre en Windows.
>
> Ante todo gracias por la ayuda.
>
> Un saludo
>
Más información sobre la lista de distribución Python-es