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