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

Filtrado por el tag: regexp
Imágen de perfil

Hilos en pyGTK (threads)gráfica de visualizaciones


Python

Publicado el 16 de Mayo del 2018 por Administrador (718 códigos)
2.100 visualizaciones desde el 16 de Mayo del 2018
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)

Publicado el 16 de Mayo del 2018gráfica de visualizaciones de la versión: Versión 1
2.101 visualizaciones desde el 16 de Mayo del 2018
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
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...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s4602