Código de Python - Hilos en pyGTK (threads)

Imágen de perfil

Hilos en pyGTK (threads)gráfica de visualizaciones


Python

estrellaestrellaestrellaestrellaestrella(1)
Publicado el 16 de Mayo del 2018 por Administrador
685 visualizaciones desde el 16 de Mayo del 2018. Una media de 56 por semana
Este código muestra como ejecutar un proceso largo sin bloquear el uso de la ventana u otras opciones del mismo utilizando hilos (threads) con los métodos: gtk.gdk.threads_init(), gtk.gdk.threads_enter() y gtk.gdk.threads_leave()

gtk-threads

Versión 1
estrellaestrellaestrellaestrellaestrella(1)

Actualizado el 17 de Mayo del 2018 (Publicado el 16 de Mayo del 2018)gráfica de visualizaciones de la versión: Versión 1
686 visualizaciones desde el 16 de Mayo del 2018. Una media de 56 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella


Forma parte de Threads en pygtk
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python
 
# Escrito por Daniel Fuentes B.
# Licencia: BSD <http://www.opensource.org/licenses/bsd-license.php>
 
import pygtk
pygtk.require("2.0")
import gtk
import os
import threading
 
# iniciamos los thead (los iniciamos, aun no lo usamos)
gtk.gdk.threads_init()
 
comando = "find /var"
 
# Esta funcion hace el trabajo "pesado", luego es llamada desde la ventana
def salida_comando(salida_texto, buffer_texto, comando):
    output = os.popen(comando)
    while True:
        linea = output.readline()
        if not linea:
            break
        # Comienza el trababjo pesado, asi que entramos en un thread
        gtk.gdk.threads_enter()
        # Se inserta la siguiente linea de la salida del proceso y luego se
        # coloca el cursor al final del textview (se mueve el scroll)
        iter = buffer_texto.get_end_iter()
        buffer_texto.place_cursor(iter)
        buffer_texto.insert(iter, linea)
        salida_texto.scroll_to_mark(buffer_texto.get_insert(), 0.1)
        # Finaliza el trabajo pesado, asi que salimos del thread
        gtk.gdk.threads_leave()
 
# Clase con la ventana principal.
class MainWindow:
    def  __init__(self):
        # Definimos la ventana inicial
        ventana = gtk.Window(gtk.WINDOW_TOPLEVEL)
        ventana.set_title("Ejemplo de threading en gtk")
        ventana.resize(450,300)
        ventana.connect("destroy", gtk.main_quit)
 
        # Creamos una caja vertical con un espacio entre widgets de 5px y con
        # la propiedad homogeneo en False. Luego agragamos las widgets al vbox
        vbox = gtk.VBox(False, 5)
 
        # Una simple etiqueta que se muestra en la parte superior de la ventana
        etiqueta = gtk.Label("Resultado del comando:")
 
        # Creamos un textview que tenga un auto scroll, o sea que se desplace
        # solo al aparecer nuevo texto que sobrepase la pantalla
        # en este textview se mostrara la salida del comando ejecutado
        scrollwin = gtk.ScrolledWindow()
        scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        salida_texto = gtk.TextView()
        buffer_texto = salida_texto.get_buffer()
        scrollwin.add(salida_texto)
 
        # creamos un boton, el que iniciara el comando al hacer click en el
        boton = gtk.Button("iniciar programa")
        boton.connect("clicked", self.on_boton_clicked, salida_texto, buffer_texto, comando)
 
        # Empacamos el textview con scroll y el boton dentro del vbox
        vbox.pack_start(etiqueta, False, False, 0)
        vbox.pack_start(scrollwin)
        vbox.pack_start(boton, False)
 
        # y luego unimos el vbox la ventana pricipal y la mostramos
        ventana.add(vbox)
        ventana.show_all()
 
    def on_boton_clicked(self, widget, salida_texto, buffer_texto, comando):
        # Este boton es el lanza el hilo (threading) al hacer click sobre el
        hilo = threading.Thread(target=salida_comando, args=(salida_texto, buffer_texto, comando))
        hilo.start()
 
if __name__ == "__main__":
    MainWindow()
    gtk.main()



Comentarios sobre la versión: Versión 1 (1)

Imágen de perfil
Miguel
19 de Mayo del 2018
estrellaestrellaestrellaestrellaestrella
Excelente aporte, esta bueno ese code fragment
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s4602  
Revisar política de publicidad