Re: Re: [PyGtk] Splash para aplicación
Ángel Guzmán Maeso
shakaran en gmail.com
Mie Mayo 21 02:14:10 CEST 2008
Como apunta él, las soluciones son gobject.idle_add y threads. Consulta
esta entrada...
http://pythonesfaq.k-rolus.net/#index72h3
... donde se habla de usar "idle_add" en conjunción con generadores.
No es evidente cuál es la mejor opción, ambas soluciones tienen ventajas
e inconvenientes.
---
Me he leído esa FAQ(y toda la lista de FAQ's) y no me ha quedado muy claro,
ya que en la pagina de Gnome (sobre los generadores)
viene mucha parte en modo "pseudocódigo" y no lo puedo ver un ejemplo real
funcionando. Como soy un principiante, aun no entiendo
muchos conceptos y tampoco he trabajado nunca con hilos (solo tengo algunas
pequeñas nociones) y menos aun se como trabajan en Python.
El ejemplo de la página de gnome para la barra de progreso, lo he intentado
extrapolar para mi código de ejemplo, pero no he conseguido hacer que
funcione, ya que necesita otro método "next" que no se indica en el pseudo
código y no se como va. Pongo de nuevo el código con las cosas nuevas que he
modificado y si podéis ponerme un ejemplo funcional o retocar lo poco que
sea en mi código lo agradecería. Espero que no sea molestía por sugerir o
hacerme el código, porque le pongo interés pero me faltan ejemplos prácticos
para llevarlo a cabo, solo necesito que me deis mas cuerda para que pueda
tirar.Gracias
----
#!/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.next, splash,None) # MODIFICADO==>
.next (no esta el def hecho)
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
yield True # #MODIFICADO: Yield, lo traduzco como "producir",
asi que lo pongo mientras produce el while
#if i%10000:
# print i
yield False # Al terminar dejo de producir, pero no se si el metodo
def "next" deba llamarse
#en el anterior while
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()
_______________________________________________
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