Pygtk y Gtk.Dialog

Arnau Sanchez arnau en ehas.org
Mar Jul 24 14:01:05 CEST 2007


Arnau Sanchez escribió:

> No obstante, el otro día leyendo ese mismo FAQ encontré lo que parece la 
> mejor alternativa para estos casos, usar generadores:
> 
> http://faq.pygtk.org/index.py?req=show&file=faq23.020.htp

Me contesto: he hecho un pequeño programa de muestra con la idea del FAQ, y 
efectivamente, creo que los generadores son de largo la mejor solución (mantra: 
threads are evil). En el ejemplo que os paso no utilizo clases (las odio 
cordialmente), pero sería trivial hacerlo en OOP:

#!/usr/bin/python
import gobject
import time
import gtk

def task(bar, ntasks, dialog):
     ntask = 0
     while ntask < ntasks:
         print "debug:", ntask
         time.sleep(0.1) # simula un trabajo pesado
         ntask += 1
         fraction = float(ntask)/ntasks
         bar.set_fraction(fraction)
         bar.set_text("%d%%"%int(100.0*fraction))
         yield True
     dialog.destroy()
     yield False

def on_button_clicked(widget, entry):
     def _on_dialog_response(widget, response, tag):
         if response == gtk.RESPONSE_REJECT:
             gobject.source_remove(tag)
             widget.destroy()
     def _on_dialog_delete_event(widget, event, tag):
         gobject.source_remove(tag)
     buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)
     bar = gtk.ProgressBar()
     dialog = gtk.Dialog(buttons=buttons, flags=gtk.DIALOG_MODAL)
     dialog.vbox.pack_start(bar, False, False)
     ntasks = int(entry.get_text())
     tag = gobject.idle_add(task(bar, ntasks, dialog).next)
     dialog.connect("response", _on_dialog_response, tag)
     dialog.connect("delete-event", _on_dialog_delete_event, tag)
     dialog.show_all()

window = gtk.Window()
box = gtk.HBox()
entry = gtk.Entry()
label = gtk.Label("Cantidad de trabajo")
entry.set_text("50")
button = gtk.Button("Pulsa para abrir una barra de progreso")
for widget in label, entry, button:
     box.pack_start(widget)
button.connect("clicked", on_button_clicked, entry)
window.connect("delete-event", lambda w, e: gtk.main_quit())
window.add(box)
window.show_all()
gtk.main()




Más información sobre la lista de distribución Python-es