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