Re: [PyGtk] Splash para aplicación (Marco Antonio Islas Cruz)

Ángel Guzmán Maeso shakaran en gmail.com
Mar Mayo 20 16:36:48 CEST 2008


Hola Marcos, he intentado hacer lo siguiente basandome en tus aplicaciones y
parece que funciona. Pero cuando el splash se lanza tengo una imagen, un
label y otra imagen de fondo para la ventana y si pasas por encima del
splash otra ventana y la quitas entonces se "congela" la imagen y se
"borran" la labels, quedandose solo la imagen de fondo. Es algo raro, que
parece como si no se refrescara el splash o algo por el estilo, no se si sea
problema mio o de GTK o como le puse que mientras hiciera el bucle enorme,
pues no le de tiempo a refrescar el splash al portatil.

Bueno pongo el código.

-----

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import gobject
import pango

class Splash:
    def create_app (self,splash, myargs):
        try:
            MiAplicacion()
        except:
            gtk.main_quit()
            raise

        splash.destroy()

    def __init__(self):
        splash=gtk.Window(gtk.WINDOW_TOPLEVEL)
        splash.set_decorated(False)
        splash.set_position(gtk.WIN_POS_CENTER)
        splash.set_size_request(250,250)
        splash.set_app_paintable(True)
        splash.set_modal(True)



        # Creo los contenidos del splash
        imagename = 'background.jpg'

        image = gtk.Image()
        image.set_from_file("logo.png")

        box=gtk.VBox()
        box.pack_start(image,True,True, 0)
        splash.add(box)

        label=gtk.Label()
        label.set_markup("<span size='x-large'><b>Mi aplicación 0.0.0.1
</b></span>")
        box.pack_start(label,True,False, 0)

        label=gtk.Label()
        label.set_markup("<span size='large'><b>Empresa S.L.</b></span>")

        eb=gtk.EventBox() # Fondo para el label
        eb.add(label)
        eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#6e896a"))
        box.pack_start(eb,True,True,0)

        #Fondo para la imagen (es lo que solo se muestra cuando se queda
pillado)
        pixbuf = gtk.gdk.pixbuf_new_from_file(imagename)
        pixmap, mask = pixbuf.render_pixmap_and_mask()
        width, height = pixmap.get_size()
        del pixbuf

        splash.resize(width, height)

        splash.realize()

        splash.window.set_back_pixmap(pixmap,False)
        del pixmap

        splash.window.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_SPLASHSCREEN)
        # needed because the window_type hint above does not work on Win32
:-/

        splash.show_all()

        # Para mostrar el splash y llamo a la aplicacion
        gobject.idle_add (self.create_app, splash,None)


class MiAplicacion:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_gravity(gtk.gdk.GRAVITY_CENTER)
        self.window.set_title("Empresa S.L.")

        # Simulacion mientras la aplicacion carga (entonces el splash se
queda
        # "congelado" si pasas otra ventana por encima y la quitas
        print "Empezando bucle"
        i=1
        while i<1000000:
            i=i+1
            #if i%10000:
            #    print i

        print "Bucle terminado"
        self.window.show_all()   # Muestra la ventana (sin tamaño por
defecto es 200x200)


def main():
    try:
        gtk.main()
    except KeyboardInterrupt:
        print "Salida por teclado"
    return 0

if __name__ == "__main__":
    print "Cargando GUI ..."
    Splash()
    print "Cargando aplicación"
    main()

---

Ahora ya funciona el splash, pero tiene la "pega" de que parece que se
cuelga. ¿A que se deberá esto?

Aunque no viene a cuento, pero es la primera vez que uso listas de correo,
y no se muy bien como funcionan para responder al mismo tema (creo que este
tema se enviara como si fuera otro) pero es que no se responder al mismo
hilo porque no se como funciona (antes solo habia utilizado foros).

Si alguien me lo puede indicar se lo agradecería.

PD: Marcos, enhorabuena por tu reproductor Christine, lo estoy utilizando y
me gusta mucho. Saludos

Message: 5
> Date: Mon, 19 May 2008 10:22:44 -0500
> From: Marco Antonio Islas Cruz <markuz en islascruz.org>
> Subject: Re: [Python-es] [PyGtk] Splash para aplicación
> To: Lista de discusión sobre python en castellano
>        <python-es en aditel.org>
> Message-ID: <1211210564.7625.5.camel en cucusa>
> Content-Type: text/plain; charset="utf-8"
>
> Facil,
>
>     1. Ejecutas tu aplicacion
>     2. Creas el splash screen y al mostrarlo ejecutas lo que va a hacer
>        que inicie tu ventana principal.
>     3. En el codigo de tu ventana principal preocupate por no bloquear
>        el ciclo principal de GTK, con un ciclo while puedes bloquearlo,
>        recuerda que estas en un solo hilo y solo un proceso de tu
>        aplicacion se ejecuta a la vez.
>             1. Puedes valerte de gobject.idle_add para ejecutar una
>                funcion cada que no tenga que hacer nada gtk.
>             2. Puedes utilizar un thread para hacer la parte pesada,
>                siempre y cuando no tenga nada que ver con GTK+ puesto
>                que Gtk solo debe ser manejado en un solo hilo.
>
> Esto es algo asi que tendras 2 procesos corriendo al mismo tiempo, uno
> que te entretenga al cliente y otro que te inicialice la aplicacion. Si
> la parte pesada de tu aplicacion es algo con una lista o cosas asi, te
> recomiendo que uses gobject.idle_add en lugar de threads.
>
> Saludos.
>
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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