• Jueves 14 de Noviembre de 2024, 04:27

Autor Tema:  pyGtk y funciones que corren en segundo plano  (Leído 1626 veces)

J'aranes

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
pyGtk y funciones que corren en segundo plano
« en: Sábado 14 de Mayo de 2011, 13:17 »
0
Muy buenas señores del código:

Este es mi primier mensaje. No sean muy duros conmigo...
Estos días me he propuesto aprender un poco de python y me ha gustado mucho.

OS PONGO EN SITUACIÓN:
Para practicar hice un script que, usando pyPdf hace lo siguiente:
- Convierte un archivo PDF en otro documento preparado para su encuadernación oldschool.
- El resultado es otro PDF con las páginas dispuestas dos a dos (2 pags. por cara) y reordenadas para su encuadernación en cuadernillos de X páginas.
- Los parámetros que se le pueden pasar al script, ademas del obligatorio "input path" son:
     - el número de páginas por cuadernillo (bookletFols)
     - las páginas en blanco que se desean al principio o al final (addStartPages, addEndPages)
     - la ruta al archivo resultado (outPath).

La función principal es esta: make_a_book (inPath, addStartPages, addEndPages, bookletFols, outPath)
El script está terminado y funciona a la perfección. He pensado en reutilizar su función principal para adaptarlo al entorno de ventanas y ya casi lo tengo terminado, pero...

...ME PONGO A TRASTEAR CON GTK:
El programita en GTK te permite hacer lo siguiente:
- Cargar el PDF origen (iniPath).
- Establecer el destino (outPath).
- Establecer mediante ajustes de escala las demás variables: (addStartPages, addEndPages, bookletFols).
- Calcula y muestra información acerca de cómo quedará configurado el documento final.

Una vez todo preparado, el boton ACEPTAR (btAceptar) llama a la función make_a_book con todo lo necesario y se crea el documento para encuadernar.

FUNCIONA? SI, hace lo que tiene que hacer.
FUNCIONA BIEN? NO. Además, le falta una barra de progreso.

EL PROBLEMA:
Cuando se crea el documento, la función make_a_book toma el control y la ventana se congela (no hay procesos paralelos).
Empecé a documentarme acerca de threads y tasks, per no me aclaro. Seguro que por aquí me podéis hechar una mano.

AL TEMA:
Código: Python
  1.  
  2. # me traigo la función principal, que está en el archivo make_a_book.py
  3. from make_a_book import make_a_book
  4.  
  5. class pdf2book_gtk:
  6.    
  7.     # funciones_auxiliares
  8.     # ...
  9.   
  10.     # aquí es donde llama el botón ACEPTAR
  11.     def procesa(self, widget):
  12.         # ...
  13.         # calculo y establezco los datos:
  14.         # iniPath, addStartPages, addEndPages, bookletFols, outPath
  15.         # ...
  16.        
  17.         # Creo el documento resultante
  18.         make_a_book (iniPath, addStartPages, addEndPages, bookletFols, outPath)
  19.        
  20.         # acaba
  21.         # muestra un diálogo de "OK, TODO CORRECTO"
  22.  
  23.     def __init__(self):
  24.         # la ventana
  25.         window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  26.         # ...
  27.  
  28.         # los botones
  29.         self.btAceptar = gtk.Button("Aceptar")
  30.         # ...
  31.        
  32.         # CONECTO
  33.         self.btAceptar.connect("clicked", self.procesa)
  34.        
  35.         #...
  36.  
  37. def main():
  38.     gtk.main()
  39.  
  40. if __name__ == "__main__":
  41.     ook = pdf2book_gtk()
  42.     main()
  43.  
  44.  

Asi que:
¿Cómo creeis que sería la mejor forma para que la llamada del botón a make_a_book quedara en segundo plano y no se congelara la ventana?
¿Sería conveniente crear una clase bookMaker que se encargara del proceso?

¿He planteado bien mi problema? Soy novato tanto en la programación como en los foros.

salut!
J'Aranes

J'aranes

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: pyGtk y funciones que corren en segundo plano
« Respuesta #1 en: Sábado 14 de Mayo de 2011, 22:59 »
0
Buenas otra vez,

Ya he dado con la solución.
La cosa es que lanzaba un thread para el proceso gordo y luego tenía problemas con la barra de progreso.
La solución es lanzar las dos cosas en hilos separados: uno para la función gorda y el otro para la barra de progreso.

Ahora a pulir el código y a encuadernar!

salut!
jordi