Pygtk y Gtk.Dialog

Javier Pérez Pacheco javielinux en gmail.com
Mar Jul 24 14:03:50 CEST 2007


Parece que FUNCIONA. Aqui está la prueba que he realizado. Sin thread ni
nada, usando la forma que comenta Arnau, con generadores, o eso creo ;-)

He creado una clase MyProgressBar y sólo tenemos que llamarla. La cosa es
que la tarea está dentro de la clase (función do_task), pero creo que para
ver la idea vale

¿que os parece?

#!/usr/bin/env python
# -*- coding: latin-1 -*-

import gtk
import os
import string
import threading
import time
import gobject

class MyProgressBar():

    def __init__(self):
        pass

    def do_task (self, data):
        i = 0
        while i<50:
            print str(i)
            i = i + 1
            time.sleep(0.1)
            self.pbar.pulse()
            yield True

        self.d.destroy()
            yield False

    def start (self, data):
        self.d = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.d.set_title("Proceso")
        self.d.set_border_width(10)

        self.pbar = gtk.ProgressBar()

        self.d.add(self.pbar)

        self.pbar.show()
        self.d.show_all()

            task = self.do_task("hola")
            gobject.idle_add(task.next)


w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_title("Prueba de barra de progreso")
w.set_border_width(20)

w.connect("destroy", gtk.main_quit)

pb = MyProgressBar()

bAccept = gtk.Button("Aceptar", gtk.STOCK_OK)
bAccept.connect("clicked", pb.start)


w.add(bAccept)
w.show_all()
gtk.main()

El día 24/07/07, Juan José Rojo <jjrojoc en hotmail.com> escribió:
>
> Has probado a utilizar un gtk.Window con un evento que se ejecute nada mas
> crear la ventana en vez de un gtk.Dialog?
> Los dialogs por default solo responden a unas señales predeterminadas.
>
> El diálogo no corre hasta que le haces un .run(),
>
>
> >From: "Javier Pérez Pacheco" <javielinux en gmail.com>
> >Reply-To: La lista de python en castellano <python-es en aditel.org>
> >To: "La lista de python en castellano" <python-es en aditel.org>
> >Subject: Re: [Python-es] Pygtk y Gtk.Dialog
> >Date: Tue, 24 Jul 2007 12:16:22 +0200
> >
> >He realiazado bastante pruebas. Lo único que hago es lanzar el Thread
> antes
> >de empezar a realizar los comandos de linux (que debería de mostrar el
> >dialogo) y cerrarlo al final (que cierra el dialogo)
> >
> >La cosa es que la ventana sale sólo si pongo d.run() y tengo que darle a
> la
> >"X" para que empiece el proceso. Si pongo d.show() no sale la ventana
> >
> >Te pongo un programa de prueba a ver si puedes ver el fallo. Debe de
> salir
> >la ventana de dialogo mientras escribe los 50 números, y sólo sale si
> pongo
> >d.run()
> >
> >no se cual puede ser el problema al poner show()
> >
> >#!/usr/bin/env python
> ># -*- coding: latin-1 -*-
> >
> >import gtk
> >import os
> >import string
> >import threading
> >import time
> >import gobject
> >
> >class MyThread(threading.Thread):
> >    def __init__(self):
> >        super(MyThread, self).__init__()
> >
> >        self.d = gtk.Dialog("Dialogo")
> >        self.d.set_border_width(4)
> >        self.d.set_modal(False)
> >
> >        self.pbar = gtk.ProgressBar()
> >
> >        self.d.vbox.pack_start(self.pbar, False, False, 0)
> >
> >        self.pbar.show()
> >
> >        self.d.show_all()
> >
> >        #self.d.show()
> >        self.d.run()
> >
> >        self.quit = False
> >
> >    def update(self):
> >        self.pbar.pulse()
> >        return False
> >
> >
> >    def close(self):
> >        self.quit = True
> >        self.d.destroy()
> >
> >    def run(self):
> >        while not self.quit:
> >            gobject.idle_add(self.update)
> >
> >t = MyThread()
> >t.start()
> >i = 0
> >while i<50:
> >    print str(i)
> >    i = i + 1
> >    time.sleep(0.1)
> >
> >t.close()
> >
> >El día 24/07/07, Jesus Rodriguez <foxandxss en gmail.com> escribió:
> >>
> >>Hola, conozco tus scripts :P
> >>
> >>Sobre tu problema, a falta de ver el código completo, te aconsejaría que
> >>intentes ver de donde viene el problema. Yo normalmente en estos casos,
> >>suelo hacer pruebas en un fichero nuevo. En este caso podrias lanzar un
> >>Thread mientras lanzas algun proceso con fork donde uses imagemagick y
> ver
> >>si funciona bien para ir descartando fallos.
> >>
> >>Siento no ayudar mucho más, la clase del thread parece correcta, pero
> >>puede
> >>no estar ahi el fallo.
> >>
> >>
> >>Un saludo.
> >>_______________________________________________
> >>Python-es mailing list
> >>Python-es en aditel.org
> >>http://listas.aditel.org/listinfo/python-es
> >>
> >_______________________________________________
> >Python-es mailing list
> >Python-es en aditel.org
> >http://listas.aditel.org/listinfo/python-es
>
> _________________________________________________________________
> Un amor, una aventura, compañía para un viaje. Regístrate gratis en MSN
> Amor
> & Amistad. http://match.msn.es/match/mt.cfm?pg=channel&tcid=162349
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>




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