viernes, 10 de agosto de 2012

Snake's Nest

Snake's Nest


PyGObject: Crear ComboBox con texto e icono

Posted: 10 Aug 2012 03:46 AM PDT

Son las 3 am y debo decir que llevo alrededor de 4 o 5 horas investigando y leyendo sobre PyGObject con el fin de hacer un port de MonPy-Qt a GTK y ofrecer una aplicacion nativa para GTK sin necesidad de instalar algo más.

Es muy interesante porque para Qt uso el diseñador de interfaces y solo corro un script que me genera un archivo .py para importar y usar, en GTK he decidido no usar Glade e intentar diseñar la interfaz a manita

La cuestion que mas me ha llevado tiempo hasta ahora (teniendo en cuenta que solo he hecho botones, etiquetas y combobox fueron precisamente los combobox.

Si le has hechado una mirada a MonPy, verás que tiene comboboxes con las iniciales de la moneda y la bandera del país que lo usa (o representa), en Qt es tan facil como agregar la imagen y ya, pero en PyGObject es otra historia.

Al final este fue el resultado:

ComboBox Expandido

ComboBox Contraido

Bastante genial no?

La forma de lograrlo (creanme, al verlo en accion tengo esa sensacion de fuck yeah) lo explicare con el codigo de mi prueba:

   #-*- coding: UTF-8 -*-  from gi.repository import Gtk,GdkPixbuf  #Importante importar los modulos correctos, no importar directamente GTK    class Ventana(Gtk.Window):  	#Hereda de Gtk.Window    	def __init__(self):  		#Se inicializa la Clase Padre y se establece el parametro del titulo  		Gtk.Window.__init__(self,title="Test Ventana lolo")    		#Se crea la ListStore que es donde se guardaran los registros del ComboBox  		#Se deben especificar los tipos de datos que se almacenaran, primero un Pixbuf (La imagen)  		#Y enseguida un String  		#MUY IMPORTANTE recordar el orden  		paises=Gtk.ListStore(GdkPixbuf.Pixbuf,str)    		#Creo la lista de Strings  		monEx=sorted(["USD","MXN","EUR","GBP","INR","AUD","CAD","JPY","RMB","THB","SGD"])    		#Lleno la lista del combo box  		for pais in monEx:  			#Creo una Instancia del objeto Pixbuf especificando la fuente y el tamaño  			image=GdkPixbuf.Pixbuf.new_from_file_at_size('images/flags/'+pais+'.png',20,20)  			#Agrego el nuevo item a la listStore  			paises.append([image,pais])    		#Una vez poblada la lista, se crea el ComboBox especificando el modelo  		#Es decir la lista con los elementos que va a desplegar  		combo=Gtk.ComboBox(model=paises)    		#Se crea el renderer (o procesador) de cada celda del combobox  		#Son 2 celdas: Una de imagen y otra de texto  		#Celda de Imagen  		renderer_pixbuf=Gtk.CellRendererPixbuf()  		#Celda de Texto  		renderer_text=Gtk.CellRendererText()    		#Ahora se agregan al ComboBox  		#Primero la imagen especificando el Renderer correspondiente al objeto Pixbuf  		combo.pack_start(renderer_pixbuf,False)  		#Seguido del texto con el renderer indicado  		combo.pack_start(renderer_text,False)    		#Le agregamos propiedades a cada celda, muy importante hacerlo  		#Primero se especifica la celda, luego la propiedad (Consultar la   		#documentacion si vas a agregar otro tipo de objeto)   		#Y como tercer parametro la columna, debe coincidir con el orden en que creaste   		#las Celdas     		#Primero la columna para la imagen  		combo.add_attribute(renderer_pixbuf, "pixbuf", 0)  		#Luego la del Texto  		combo.add_attribute(renderer_text,"text",1)  		#Finalmente se elige en que posicion va a iniciar el combobox  		combo.set_active(0)  		#Y se agrega a la ventana  		self.add(combo)    """  Se prueba la clase"  """  win=Ventana()  win.connect("delete-event",Gtk.main_quit)  win.show_all()  Gtk.main()      

Con ésto ya es posible obtener el resultado antes visto.


Filed under: Programacion, Python, Tips y Tutoriales Tagged: GNOME, GTK, PyGObject

No hay comentarios:

Publicar un comentario

Sigue todas las entradas por email