<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1383021601049255291</id><updated>2022-08-18T06:37:45.208-04:00</updated><category term="gtk"/><category term="python"/><category term="glade"/><category term="tutorial"/><category term="gtkbuilder"/><category term="como usar"/><category term="combobox"/><category term="popular"/><category term="sqlite"/><category term="ssms"/><category term="bandeja"/><category term="email"/><category term="icono"/><category term="menu"/><category term="smtplib"/><category term="system tray"/><category term="tray"/><category term="treeview"/><category term="vista de arbol"/><category term="vista de texto"/><title type='text'>Piton.py</title><subtitle type='html'>Tutoriales de Python, GTK+ y más</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-5876223211760854312</id><published>2010-05-06T14:46:00.010-04:00</published><updated>2010-05-06T15:55:10.561-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="como usar"/><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="gtkbuilder"/><category scheme="http://www.blogger.com/atom/ns#" term="popular"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="sqlite"/><category scheme="http://www.blogger.com/atom/ns#" term="treeview"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="vista de arbol"/><title type='text'>Cómo usar: TreeView</title><content type='html'>Veamos cómo cargar y mostrar datos en un TreeView.&lt;br /&gt;&lt;br /&gt;Para todos los ejemplos vamos a usar una simple ventana con un TreeView y un botón hechos con Glade:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S-MVxYVPQ4I/AAAAAAAAApc/pB-O-rifMGI/s1600/Pantallazo-int.xml.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 265px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S-MVxYVPQ4I/AAAAAAAAApc/pB-O-rifMGI/s400/Pantallazo-int.xml.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5468238310647219074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Popular directamente&lt;/span&gt;&lt;br /&gt;Para agregar elementos al TreeView se siguen tres pasos: crear una lista con los elementos, crear las columnas necesarias para el TreeView, y por último asignarles la lista y las columnas creadas. Veamos cómo hacerlo:&lt;br /&gt;&lt;br /&gt;Creamos la lista y le agregamos los elementos:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def populartreeview(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista=gtk.ListStore(str)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Negro&quot;])&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Verde&quot;])&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Blanco&quot;])&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Creamos la columna:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;render=gtk.CellRendererText()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;columna=gtk.TreeViewColumn(&quot;Colores&quot;,render,text=0)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Asignamos la lista y la columna al TreeView:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.set_model(lista)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.append_column(columna)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.show()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Obs.: si necesitamos que hayan más columnas, sólo debemos modificar la forma en que se crea la lista, por ejemplo, para almacenar una cadena y un número entero en cada elemento, usamos &lt;span style=&quot;font-style:italic;&quot;&gt;lista = gtk.ListStore(str,int)&lt;/span&gt;. Además hay que crear las columnas necesarias y asignarlas al TreeView. Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def populartreeview(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista=gtk.ListStore(str,int)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Negro&quot;,12])&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Verde&quot;,11])&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;lista.append([&quot;Blanco&quot;,13])&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;render=gtk.CellRendererText()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;columna1=gtk.TreeViewColumn(&quot;Colores&quot;,render,text=0)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;columna2=gtk.TreeViewColumn(&quot;Precios&quot;,render,text=1)&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.set_model(lista)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.append_column(columna1)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.append_column(columna2)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.vista.show()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S-MaAhYmxtI/AAAAAAAAApk/RnqsPUzblTs/s1600/Pantallazo-populardirectamente.py.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 308px; height: 228px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S-MaAhYmxtI/AAAAAAAAApk/RnqsPUzblTs/s400/Pantallazo-populardirectamente.py.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5468242968821810898&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Obtener elementos&lt;/span&gt;&lt;br /&gt;Usemos el botón que creamos para obtener el elemento seleccionado de la vista.&lt;br /&gt;&lt;br /&gt;Nos aseguramos de darle el manipulador &lt;span style=&quot;font-style:italic;&quot;&gt;on_boton_clicked&lt;/span&gt; a la señal &lt;span style=&quot;font-style:italic;&quot;&gt;clicked&lt;/span&gt; del botón y escribimos el siguiente método para obtener la selección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def on_boton_clicked(self, widget, data=None):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;(model,iter)=self.vista.get_selection().get_selected()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if iter != None:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;print list(model[iter])&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Podemos hacer lo que queramos con los datos obtenidos, en el ejemplo simplemente los imprimimos.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://groups.google.com.py/group/pitonpy/web/treeview1.tar.gz?hl=es&quot;&gt;Descargar programa ejemplo&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/5876223211760854312/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/05/como-usar-treeview.html#comment-form' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/5876223211760854312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/5876223211760854312'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/05/como-usar-treeview.html' title='Cómo usar: TreeView'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_dbPdGYD9Urg/S-MVxYVPQ4I/AAAAAAAAApc/pB-O-rifMGI/s72-c/Pantallazo-int.xml.png" height="72" width="72"/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-3279863590370365878</id><published>2010-04-25T17:15:00.014-04:00</published><updated>2010-04-26T01:03:10.156-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bandeja"/><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="icono"/><category scheme="http://www.blogger.com/atom/ns#" term="menu"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="system tray"/><category scheme="http://www.blogger.com/atom/ns#" term="tray"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Añadir ícono a la bandeja del sistema</title><content type='html'>Veamos cómo añadir un ícono para nuestras aplicaciones en la bandeja del sistema, y cómo agregar un menú a este ícono.&lt;br /&gt;&lt;br /&gt;Como siempre, en los tutoriales trabajamos con Geany y Glade 3.&lt;br /&gt;&lt;br /&gt;Hagamos un sencillo programa que consista sólo de un ícono en la bandeja del sistema, que muestre un mensaje si recibe un click izquierdo, y despliegue un menú si recibe uno derecho.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Crear el ícono&lt;/span&gt;&lt;br /&gt;Abrimos Glade y agregamos un &quot;Ícono de Estado&quot; (nombre que le da GTK+ al ícono que va en la bandeja):&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S9Tpc82ZVoI/AAAAAAAAAno/JnRvXdwpwpA/s1600/Pantallazo-*Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 270px;&quot; src=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S9Tpc82ZVoI/AAAAAAAAAno/JnRvXdwpwpA/s400/Pantallazo-*Sin+guardar+1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464248931487143554&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Le damos nombre y una imagen, yo le puse &quot;iconobandeja&quot; y usé &lt;a href=&quot;http://groups.google.com.py/group/pitonpy/web/arch.png?hl=es&quot;&gt;esta&lt;/a&gt; imagen. La imagen la seleccionamos en la propiedad &quot;Pixbuf&quot;:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S9Tseg9N_3I/AAAAAAAAAnw/wLkXYaMIb1Q/s1600/Pantallazo-interfaz.xml.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 399px; height: 285px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S9Tseg9N_3I/AAAAAAAAAnw/wLkXYaMIb1Q/s400/Pantallazo-interfaz.xml.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464252256894189426&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ahora le damos manipuladores a las señales &quot;activate&quot; y &quot;popup_menu&quot;:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S9Tt6jj8a0I/AAAAAAAAAn4/agIQuO5xu5k/s1600/Pantallazo-*interfaz.xml.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S9Tt6jj8a0I/AAAAAAAAAn4/agIQuO5xu5k/s400/Pantallazo-*interfaz.xml.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464253838141451074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Guardamos el archivo y abrimos nuestro IDE (Geany). Para este tutorial guardé el archivo como &quot;interfaz.xml&quot;.&lt;br /&gt;&lt;br /&gt;Importamos los módulos necesarios, creamos la clase y el constructor, y corremos el programa:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;import pygtk&lt;br /&gt;import gtk&lt;br /&gt;&lt;br /&gt;class icono:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def __init__(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;builder = gtk.Builder()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;builder.add_from_file(&quot;interfaz.xml&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.iconobandeja = builder.get_object(&quot;iconobandeja&quot;)&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;builder.connect_signals(self)&lt;br /&gt;&lt;br /&gt;icono()&lt;br /&gt;gtk.main()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Click izquierdo en el ícono&lt;/span&gt;&lt;br /&gt;El programa anterior no hace en realidad nada más que mostrar el ícono en la bandeja. Programemos ahora el manipulador de la señal &quot;activate&quot;, que se ejecuta cuando el ícono recibe un click izquierdo.&lt;br /&gt;&lt;br /&gt;Hagamos que se muestre una ventana con un mensaje. Para hacer más interesante esto (y no estar creando la ventana en Glade), hagamos la ventana en Gtk+ puro (es importante conocer al menos lo básico).&lt;br /&gt;&lt;br /&gt;Agregamos el siguiente método a nuestra clase:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def on_iconobandeja_activate(self, widget, data=None):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ventana = gtk.Window()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;etiqueta = gtk.Label()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;etiqueta.set_label(&quot;Ventana hecha con Gtk+ puro!&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ventana.add(etiqueta)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ventana.show_all()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo que hacemos es, explicando línea por línea: creamos una ventana, creamos una etiqueta, establecemos el texto de la etiqueta, la agregamos a la ventana, y por último la mostramos.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Click derecho en el ícono&lt;/span&gt;&lt;br /&gt;Programemos ahora el manipulador de la señal &quot;popup_menu&quot;, que se ejecuta con un click derecho del ratón, para mostrar un menú.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S9UGDOwZWnI/AAAAAAAAAoA/uLBTipbt1Jk/s1600/Pantallazo-*interfaz.xml-1.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 212px; height: 308px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S9UGDOwZWnI/AAAAAAAAAoA/uLBTipbt1Jk/s320/Pantallazo-*interfaz.xml-1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464280375454423666&quot; /&gt;&lt;/a&gt;Abrimos Glade y creamos el menú (&quot;Menu Emergente&quot;). Le ponemos un nombre, en mi caso simplemente le puse &quot;menu&quot;.&lt;br /&gt;&lt;br /&gt;Luego, a la derecha, en donde dice Widgets damos click derecho al menu que creamos y seleccionamos la opción &quot;Edit...&quot;. Vamos a la pestaña Jerarquía y hacemos click en &quot;Añadir&quot; para agregar un elemento.&lt;br /&gt;&lt;br /&gt;Vamos a crear un solo elemento para este programa, que permita salir del mismo. Le ponemos nombre y etiqueta (&quot;salir&quot;, por ejemplo) y cerramos la ventana de edición del menú.&lt;br /&gt;&lt;br /&gt;Le damos el manipulador &quot;on_salir_activate&quot; a la señal activate del elemento que acabamos de crear para nuestro menú.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S9UVh12p9xI/AAAAAAAAAoI/I5ElmhEOKUE/s1600/Pantallazo-Editar+men%C3%BA+-+menu.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 230px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S9UVh12p9xI/AAAAAAAAAoI/I5ElmhEOKUE/s200/Pantallazo-Editar+men%C3%BA+-+menu.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464297394020153106&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S9UVpaxfA3I/AAAAAAAAAoQ/OdzoEckLgFs/s1600/Pantallazo-*interfaz.xml-2.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 237px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S9UVpaxfA3I/AAAAAAAAAoQ/OdzoEckLgFs/s320/Pantallazo-*interfaz.xml-2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464297524189660018&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Guardamos el archivo y vamos al IDE a escribir el código.&lt;br /&gt;&lt;br /&gt;Agregamos el menu al constructor:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.menu = builder.get_object(&quot;menu&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.salir = builder.get_object(&quot;salir&quot;)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Creamos el método del manipulador de la señal popup_menu, para desplegar el menú cuando se reciba un click derecho:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def on_iconobandeja_popup_menu(self, widget, button, activate_time): &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.menu.popup(None, None, None, button, activate_time)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Por último programamos el elemento que agregamos a nuestro menú:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160def on_salir_activate(self, widget, data=None):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;gtk.main_quit()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado debería de ser el siguiente:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S9UdFAgG-VI/AAAAAAAAAoY/543i5PUQTUk/s1600/Pantallazo.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 336px; height: 152px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S9UdFAgG-VI/AAAAAAAAAoY/543i5PUQTUk/s400/Pantallazo.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5464305694755191122&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Con un click derecho debe de aparecer un menú con un elemento que diga &quot;Salir&quot;, y al hacer click en éste el programa debe terminar.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://groups.google.com.py/group/pitonpy/web/iconobandeja.tar.gz?hl=es&quot;&gt;Descargar programa ejemplo&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/3279863590370365878/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/04/anadir-icono-la-bandeja-del-sistema.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/3279863590370365878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/3279863590370365878'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/04/anadir-icono-la-bandeja-del-sistema.html' title='Añadir ícono a la bandeja del sistema'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_dbPdGYD9Urg/S9Tpc82ZVoI/AAAAAAAAAno/JnRvXdwpwpA/s72-c/Pantallazo-*Sin+guardar+1.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-607784155236638122</id><published>2010-04-19T00:06:00.000-04:00</published><updated>2010-04-19T00:06:00.393-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="combobox"/><category scheme="http://www.blogger.com/atom/ns#" term="como usar"/><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="popular"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="sqlite"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Cómo usar: ComboBox (II)</title><content type='html'>Veamos algunos ejemplos más.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Popular ComboBox desde un archivo de texto:&lt;/span&gt;&lt;br /&gt;Supongamos que tenemos almacenada una serie de datos en un archivo de texto, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Zapatos,Camisas,Pantalones,Remeras,Shorts,Gorras&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En este archivo tenemos varios elementos separados por comas. Llamémoslo &quot;Archivo.txt&quot;.&lt;br /&gt;Para cargar los elementos a partir de este archivo usamos la siguiente función:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def popularcombo(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos=gtk.ListStore(str)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;archivo = open(&quot;Archivo.txt&quot;,&quot;r&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for line in archivo.readlines():&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = 0&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = &quot;&quot;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while i&amp;lt;len(line):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if line[i] == &quot;,&quot;:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos.append([cadena])&lt;br /&gt;&amp;#160;&amp;#160&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = &quot;&quot;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = i+1&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = cadena + line[i]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = i+1&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.set_model(listaelementos)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;render=gtk.CellRendererText()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.pack_start(render, True)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.add_attribute(render, &#39;text&#39;, 0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Expliquemos cada línea:&lt;br /&gt;Creamos la función y el objeto listaelementos, en el que vamos a almacenar nuestros elementos:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;def popularcombo(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos=gtk.ListStore(str)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Abrimos el archivo:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;archivo = open(&quot;Archivo.txt&quot;,&quot;r&quot;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Utilizamos el bucle for para que el proceso se repita por cada línea del archivo (en este ejemplo el archivo tiene una sola línea) e inicializamos algunas variables auxiliares:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for line in archivo.readlines():&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = 0&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = &quot;&quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Con un bucle while vamos examinando cada caracter de la línea del archivo. Si se encuentra una coma, se agrega a la lista el contenido de la cadena y se vacía la cadena. Si se encuentra cualquier otro caracter, se lo añade a la cadena:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;while i&amp;lt;len(line):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if line[i] == &quot;,&quot;:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos.append([cadena])&lt;br /&gt;&amp;#160;&amp;#160&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = &quot;&quot;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = i+1&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cadena = cadena + line[i]&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;i = i+1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Por último le asignamos la lista al ComboBox y mostramos los elementos:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.set_model(listaelementos)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;render=gtk.CellRendererText()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.pack_start(render, True)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.add_attribute(render, &#39;text&#39;, 0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;a href=&quot;http://groups.google.com/group/pitonpy/web/ComboBox_ejemplo1.tar.gz&quot;&gt;Descargar programa ejemplo&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Popular ComboBox desde una base de datos SQLite:&lt;/span&gt;&lt;br /&gt;Supongamos que tenemos una tabla con planetas y sus radios. Para mostrarlos en el ComboBox es simplemente modificar la función anterior de modo que quede de la siguiente manera (Obs.: para trabajar con bases de datos SQLite se debe importar el módulo sqlite3):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def popularcombo(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos=gtk.ListStore(str,int)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;bd = sqlite3.connect(&quot;Archivo.dat&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cursor = bd.cursor()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cursor.execute(&#39;SELECT * FROM planetas&#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for row in cursor:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos.append(row)&lt;br /&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.set_model(listaelementos)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;render=gtk.CellRendererText()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.pack_start(render, True)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.combo.add_attribute(render, &#39;text&#39;, 0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Explicando:&lt;br /&gt;Cargamos la base de datos y creamos el objeto cursor:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;bd = sqlite3.connect(&quot;Archivo.dat&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cursor = bd.cursor()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Seleccionamos todos los elementos de la tabla &quot;planetas&quot; de nuestra base de datos y añadimos a nuestra lista cada par de datos:&lt;br /&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;cursor.execute(&#39;SELECT * FROM planetas&#39;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;for row in cursor:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;listaelementos.append(row)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;a href=&quot;http://groups.google.com/group/pitonpy/web/ComboBox_ejemplo2.tar.gz&quot;&gt;Descargar programa ejemplo&lt;/a&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/607784155236638122/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/04/como-usar-combobox-ii.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/607784155236638122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/607784155236638122'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/04/como-usar-combobox-ii.html' title='Cómo usar: ComboBox (II)'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-8206460818755203187</id><published>2010-04-18T00:12:00.015-04:00</published><updated>2010-04-22T17:32:08.170-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="combobox"/><category scheme="http://www.blogger.com/atom/ns#" term="como usar"/><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="gtkbuilder"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Cómo usar: ComboBox (I)</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S8qHkC6uItI/AAAAAAAAAmY/Kcx4sBliOMo/s1600/combossms.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 83px; height: 43px;&quot; src=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S8qHkC6uItI/AAAAAAAAAmY/Kcx4sBliOMo/s400/combossms.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461326551468352210&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Vamos a analizar en este tutorial el uso de los ComboBox.&lt;br /&gt;Como siempre, vamos a utilizar Geany como IDE, Glade y Python.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Comencemos:&lt;/span&gt;&lt;br /&gt;Abrimos Glade y creamos una ventana, una botonera de un solo elemento, y dentro de esta botonera, un ComboBox (caja combo).&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S8qHkTcl5iI/AAAAAAAAAmg/5WcVmzgm8mA/s1600/Pantallazo-*Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 290px;&quot; src=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S8qHkTcl5iI/AAAAAAAAAmg/5WcVmzgm8mA/s400/Pantallazo-*Sin+guardar+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461326555905386018&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Le damos nombres a los elementos (es bueno acostumbrarse a hacerlo). Para este tutorial le puse “ventanaprincipal” a la ventana y “combo” al ComboBox.&lt;br /&gt;Damos el manipulador “on_ventanaprincipal_destroy” a la señal destroy de la ventana y guardamos el archivo, en mi caso le puse el nombre “combo.xml”.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qHkk4Tg7I/AAAAAAAAAmo/9EtzEeDBEDk/s1600/Pantallazo-combo.xml.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 290px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qHkk4Tg7I/AAAAAAAAAmo/9EtzEeDBEDk/s400/Pantallazo-combo.xml.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461326560585024434&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Popular el ComboBox:&lt;/span&gt;&lt;br /&gt;Veamos como hacer que nuestro ComboBox muestre una lista de elementos.&lt;br /&gt;&lt;br /&gt;Abrimos Geany, creamos un archivo nuevo. Importamos los módulos necesarios, creamos la clase y el constructor:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pygtk&lt;br /&gt;import gtk&lt;br /&gt;&lt;br /&gt;class combo:&lt;br /&gt;   def __init__(self):&lt;br /&gt;      builder = gtk.Builder()&lt;br /&gt;      builder.add_from_file(&quot;combo.xml&quot;)&lt;br /&gt;      self.ventanaprincipal = builder.get_object(&quot;ventanaprincipal&quot;)&lt;br /&gt;      self.combo = builder.get_object(&quot;combo&quot;)&lt;br /&gt;&lt;br /&gt;      builder.connect_signals(self)&lt;br /&gt;      self.ventanaprincipal.show()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ahora escribamos una función (o método) para cargar los elementos y mostrarlos en nuestro ComboBox:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   def popularcombo(self):&lt;br /&gt;      listaelementos=gtk.ListStore(str)&lt;br /&gt;      listaelementos.append([&quot;Manzanas&quot;])&lt;br /&gt;      listaelementos.append([&quot;Peras&quot;])&lt;br /&gt;      listaelementos.append([&quot;Naranjas&quot;])&lt;br /&gt;&lt;br /&gt;      self.combo.set_model(listaelementos)&lt;br /&gt;      render = gtk.CellRendererText()&lt;br /&gt;      self.combo.pack_start(render, True)&lt;br /&gt;      self.combo.add_attribute(render, &#39;text&#39;, 0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Como se puede ver, lo primero que se hace es crear un objeto de la clase gtk.ListStore(), que nos servirá para almacenar los elementos; el argumento str indica que vamos a almacenar cadenas de texto. Luego agregamos los elementos a la lista, y por último asociamos esa lista a nuestro ComboBox usando self.combo.set_model(). Las tres últimas líneas son las que se encargan de mostrar los elementos en el ComboBox.&lt;br /&gt;&lt;br /&gt;Programamos el método &quot;on_ventanaprincipal_destroy&quot;, creamos un objeto de la clase combo (la que acabamos de crear) y llamamos a su función &quot;popularcombo()&quot;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   def on_ventanaprincipal_destroy(self, widget, data=None):&lt;br /&gt;      gtk.main_quit()&lt;br /&gt;&lt;br /&gt;ejemplo = combo()&lt;br /&gt;ejemplo.popularcombo()&lt;br /&gt;gtk.main()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Guardamos el archivo y ejecutamos el programa:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qTdwGewbI/AAAAAAAAAmw/MtLHgHwW6Sk/s1600/Pantallazo-combo.py.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 150px; height: 89px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qTdwGewbI/AAAAAAAAAmw/MtLHgHwW6Sk/s400/Pantallazo-combo.py.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461339637477720498&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Obtener un elemento del ComboBox:&lt;/span&gt;&lt;br /&gt;El programa anterior no sirve de mucho si no podemos recuperar ningún elemento del ComboBox. Hagamos unas modificaciones al programa de forma que al presionar un botón se obtenga el elemento activo en ese momento.&lt;br /&gt;&lt;br /&gt;Abrimos Glade, agregamos un elemento más a la botonera del programa anterior y colocamos un boton en el nuevo espacio (al que para este tutorial llamé &quot;boton&quot; y le puse de etiqueta &quot;Click aquí&quot;). Le damos el manipulador &quot;on_boton_clicked&quot; a la señal clicked del botón y guardamos el archivo.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S8qV5FcnxII/AAAAAAAAAm4/vtCvQ_fWu14/s1600/Pantallazo-combo.xml-1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 290px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S8qV5FcnxII/AAAAAAAAAm4/vtCvQ_fWu14/s400/Pantallazo-combo.xml-1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461342306087453826&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Hagamos las modificaciones necesarias al código de nuestro programa (las nuevas líneas están en cursiva):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pygtk&lt;br /&gt;import gtk&lt;br /&gt;&lt;br /&gt;class combo:&lt;br /&gt;   def __init__(self):&lt;br /&gt;      builder = gtk.Builder()&lt;br /&gt;      builder.add_from_file(&quot;combo.xml&quot;)&lt;br /&gt;      self.ventanaprincipal = builder.get_object(&quot;ventanaprincipal&quot;)&lt;br /&gt;      self.combo = builder.get_object(&quot;combo&quot;)&lt;br /&gt;      &lt;span style=&quot;font-style: italic;&quot;&gt;self.boton = builder.get_object(&quot;boton&quot;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      builder.connect_signals(self)&lt;br /&gt;      self.ventanaprincipal.show()&lt;br /&gt;&lt;br /&gt;  def popularcombo(self):&lt;br /&gt;      listaelementos=gtk.ListStore(str)&lt;br /&gt;      listaelementos.append([&quot;Manzanas&quot;])&lt;br /&gt;      listaelementos.append([&quot;Peras&quot;])&lt;br /&gt;      listaelementos.append([&quot;Naranjas&quot;])&lt;br /&gt;&lt;br /&gt;      self.combo.set_model(listaelementos)&lt;br /&gt;      render = gtk.CellRendererText()&lt;br /&gt;      self.combo.pack_start(render, True)&lt;br /&gt;      self.combo.add_attribute(render, &#39;text&#39;, 0)&lt;br /&gt;&lt;br /&gt;  def on_ventanaprincipal_destroy(self, widget, data=None):&lt;br /&gt;      gtk.main_quit()&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;  def on_boton_clicked(self, widget, data=None):&lt;br /&gt;      model = self.combo.get_model()&lt;br /&gt;      activo = self.combo.get_active()&lt;br /&gt;      if activo &gt;= 0:&lt;br /&gt;         self.boton.set_label(model[activo][0])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ejemplo = combo()&lt;br /&gt;ejemplo.popularcombo()&lt;br /&gt;gtk.main()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Analicemos las nuevas líneas: en el constructor agregamos el botón y más abajo creamos un nuevo método (&quot;on_boton_clicked&quot;). En este método lo que hacemos es obtener el modelo que está asociado a nuestro ComboBox (la lista de los elementos), obtenemos el número del elemento activo en ese momento en el ComboBox, y por último le damos uso al elemento obtenido (en este tutorial lo usamos para cambiar la etiqueta del botón).&lt;br /&gt;Obs.: Si no seleccionamos ningún elemento (por defecto), el número del elemento activo es -1.&lt;br /&gt;&lt;br /&gt;Guardamos el archivo y ejecutamos:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S8qcfu_NKNI/AAAAAAAAAnA/KWM9ugjt2Xg/s1600/Pantallazo-combo.py-1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 220px; height: 59px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S8qcfu_NKNI/AAAAAAAAAnA/KWM9ugjt2Xg/s400/Pantallazo-combo.py-1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461349567143160018&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Al dar click al botón:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qcflZnCPI/AAAAAAAAAnI/QjUhqjM3lRU/s1600/Pantallazo-combo.py-2.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 220px; height: 59px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S8qcflZnCPI/AAAAAAAAAnI/QjUhqjM3lRU/s400/Pantallazo-combo.py-2.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5461349564569553138&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://pitonpy.blogspot.com/2010/04/como-usar-combobox-ii.html&quot;&gt;Ver más ejemplos: Popular desde archivos de texto y desde bases de datos SQLite.&lt;br /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/8206460818755203187/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/04/como-usar-combobox.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/8206460818755203187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/8206460818755203187'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/04/como-usar-combobox.html' title='Cómo usar: ComboBox (I)'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_dbPdGYD9Urg/S8qHkC6uItI/AAAAAAAAAmY/Kcx4sBliOMo/s72-c/combossms.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-7584816337725303387</id><published>2010-03-21T23:07:00.014-03:00</published><updated>2010-03-22T02:30:16.792-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="email"/><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="gtkbuilder"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="smtplib"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><category scheme="http://www.blogger.com/atom/ns#" term="vista de texto"/><title type='text'>Enviar correo electrónico con Python usando smtplib</title><content type='html'>En este tutorial vamos a ver cómo enviar mensajes de correo electrónico usando la biblioteca smtplib. Además vamos a programar una interfaz gráfica que permita tomar el texto de una caja de entrada y enviarlo usando el smtplib.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Herramientas&lt;br /&gt;&lt;/span&gt;Vamos a usar, en este tutorial:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Geany como IDE.&lt;/li&gt;&lt;li&gt;Python (por supuesto).&lt;/li&gt;&lt;li&gt;Una versión reciente de Glade (al menos 3.6).&lt;/li&gt;&lt;li&gt;Posiblemente haga falta una versión actual de pygtk también.&lt;/li&gt;&lt;/ul&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Uso de smtplib&lt;br /&gt;&lt;/span&gt;Para comenzar, vamos a escribir un pequeño programa que sea capaz de enviar un mensaje de email usando una cuenta de Gmail.&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Lo primero es importar la biblioteca smtplib:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import smtplib&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora generamos el mensaje. Primero pedimos el nombre del remitente, luego la dirección de destino y por último el mensaje en sí:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DE = raw_input(&quot;Remitente: &quot;)&lt;br /&gt;PARA = [raw_input(&quot;Destino: &quot;)]&lt;br /&gt;texto = &quot;&quot;&quot;&lt;br /&gt;%s&quot;&quot;&quot; % raw_input(&quot;Mensaje: &quot;)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Analicemos cada línea: al pedir el remitente no hay nada de especial, cuando pedimos la dirección de destino hay que recordar que se debe guardar como una lista, y, por último, al pedir el texto hay que tener en cuenta que se envía desde la segunda línea para adelante.&lt;br /&gt;&lt;br /&gt;Creamos un objeto al que llamamos &quot;server&quot; usando la clase smtplib.SMTP() de la biblioteca smtplib, nos autenticamos y enviamos el mensaje:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;server = smtplib.SMTP(&quot;smtp.gmail.com:587&quot;)&lt;br /&gt;server.starttls()&lt;br /&gt;server.login(&quot;nombredeusuario&quot;, &quot;contraseña&quot;)&lt;br /&gt;server.sendmail(DE, PARA, texto)&lt;br /&gt;server.quit()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Gráficamente&lt;/span&gt;&lt;br /&gt;Vamos a crear una interfaz gráfica para el programa anterior.&lt;br /&gt;&lt;br /&gt;Abrimos Glade y creamos una ventana con una caja horizontal de cuatro elementos. Le damos por nombre &quot;ventanaprincipal&quot; a nuestra ventana y le ponemos una anchura predeterminada de 400 y una altura predeterminada de 300 en sus propiedades (pestaña General):&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S6bue5iZF9I/AAAAAAAAAkk/E-KUJP73DPg/s1600-h/Pantallazo-*Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 249px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S6bue5iZF9I/AAAAAAAAAkk/E-KUJP73DPg/s400/Pantallazo-*Sin+guardar+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5451306613587122130&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;En la parte superior de nuestra caja colocamos una vista de texto, en la segunda y en la tercera una entrada de texto, y en la cuarta una botonera de un solo elemento. Dentro de esa botonera colocamos un botón:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S6bvxrkEGBI/AAAAAAAAAks/ujJqH7kIjHI/s1600-h/Pantallazo-*Sin+guardar+1-1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 245px;&quot; src=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S6bvxrkEGBI/AAAAAAAAAks/ujJqH7kIjHI/s400/Pantallazo-*Sin+guardar+1-1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5451308035765180434&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Le ponemos nombres a nuestros elementos: a nuestra vista de texto le ponemos &quot;mensaje&quot;, a nuestras entradas de texto &quot;remitente&quot; y &quot;destino&quot; (además cambiamos su propiedad &quot;Texto&quot;, en la pestaña General, por &quot;Remitente&quot; y &quot;Destino&quot;, respectivamente), y a nuestro botón &quot;botonenviar (y le ponemos en su propiedad Etiqueta la palabra &quot;Enviar&quot;):&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S6bxfBenBeI/AAAAAAAAAk0/1prknE9XhMQ/s1600-h/Pantallazo-*Sin+guardar+1-2.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 245px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S6bxfBenBeI/AAAAAAAAAk0/1prknE9XhMQ/s400/Pantallazo-*Sin+guardar+1-2.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5451309914253624802&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Le damos el manipulador &quot;on_botonenviar_clicked&quot; a la señal Clicked de nuestro botón y el manipulador &quot;on_ventanaprincipal_destroy&quot; a la señal Destroy de nuestra ventana principal.&lt;br /&gt;&lt;br /&gt;En la propiedad Modo de Ajuste de nuestra vista de texto (mensaje), seleccionamos &quot;Palabra&quot;, de esta forma al encontrarse que una palabra no cabe en la vista, se baja a la siguiente línea automáticamente.&lt;br /&gt;&lt;br /&gt;Vamos a la pestaña Empaquetado de nuestras propiedades y cambiamos la propiedad Expandir de las dos entradas de texto (remitente y destino) y de la botonera por &quot;No&quot;. De esta forma todo el espacio de la ventana es reservado para nuestro mensaje, y los demás elementos sólo reciben el espacio necesario para ser visibles:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S6b1u8dsN1I/AAAAAAAAAk8/FHYsFd8dNxc/s1600-h/Pantallazo-interfaz.xml.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 245px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S6b1u8dsN1I/AAAAAAAAAk8/FHYsFd8dNxc/s400/Pantallazo-interfaz.xml.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5451314585832011602&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Guardamos el archivo como &quot;Interfaz.xml&quot;.&lt;br /&gt;&lt;br /&gt;Abrimos Geany (o cualquier otro IDE o editor de texto) y empezamos a escribir el programa. Primero importamos los módulos necesarios:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import smtplib&lt;br /&gt;import pygtk&lt;br /&gt;import gtk&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Creamos la clase &quot;enviaremail&quot; y su constructor:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class enviaremail:&lt;br /&gt;   def __init__(self):&lt;br /&gt;     &lt;br /&gt;      builder = gtk.Builder()&lt;br /&gt;      builder.add_from_file(&quot;interfaz.xml&quot;)&lt;br /&gt;     &lt;br /&gt;      self.ventanaprincipal = builder.get_object(&quot;ventanaprincipal&quot;)&lt;br /&gt;      self.mensaje = builder.get_object(&quot;mensaje&quot;).get_buffer()&lt;br /&gt;      self.remitente = builder.get_object(&quot;remitente&quot;)&lt;br /&gt;      self.destino = builder.get_object(&quot;destino&quot;)&lt;br /&gt;      self.botonenviar = builder.get_object(&quot;botonenviar&quot;)&lt;br /&gt;&lt;br /&gt;      builder.connect_signals(self)&lt;br /&gt;     &lt;br /&gt;      self.ventanaprincipal.show()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo acabamos de hacer fue simplemente crear el objeto &quot;builder&quot; y cargar los elementos que creamos desde el archivo &quot;interfaz.xml&quot;. Luego autoconectar todas las señales y mostrar la ventana principal.&lt;br /&gt;&lt;br /&gt;Ahora programamos el manipulador para la señal Clicked de nuestro botón (cuando se lo presiona):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   def on_botonenviar_clicked(self, widget, data=None):&lt;br /&gt;      DE = self.remitente.get_text()&lt;br /&gt;      PARA = [self.destino.get_text()]&lt;br /&gt;     &lt;br /&gt;      inicio, fin = self.mensaje.get_bounds()&lt;br /&gt;     &lt;br /&gt;      texto = &quot;&quot;&quot;&lt;br /&gt;%s&lt;br /&gt;      &quot;&quot;&quot; % self.mensaje.get_text(inicio, fin)&lt;br /&gt;     &lt;br /&gt;      server = smtplib.SMTP(&quot;smtp.gmail.com:587&quot;)&lt;br /&gt;      server.starttls()&lt;br /&gt;      server.login(&quot;nombredeusuario&quot;, &quot;contraseña&quot;)&lt;br /&gt;      server.sendmail(DE, PARA, texto)&lt;br /&gt;      server.quit()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Como se puede ver, el código es el mismo del primer ejemplo, con algunas diferencias: ahora el destino y el remitente son el contenido de las entradas de texto destino y remitente, respectivamente.&lt;br /&gt;Para el texto del mensaje en sí, la cosa es un poco más complicada. La forma de leer el texto de una vista de texto es estableciendo unas marcas en el inicio y el final del mismo, con la funcion get_bounds(). Éstas marcas se guardan en las variables inicio y fin, que luego se pasan a la función get_text() para conseguir el texto de la vista.&lt;br /&gt;&lt;br /&gt;Para terminar creamos el manipulador para la señal Destroy de la ventana principal e iniciamos el programa:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   def on_ventanaprincipal_destroy(self, widget, data=None):&lt;br /&gt;      gtk.main_quit()&lt;br /&gt;&lt;br /&gt;enviaremail()&lt;br /&gt;gtk.main()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Guardamos el archivo como &quot;enviaremail.py&quot; y lo ejecutamos:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S6cAS3LJiBI/AAAAAAAAAlE/cna2XLiW7uA/s1600-h/Pantallazo-enviaremail.py.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 258px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S6cAS3LJiBI/AAAAAAAAAlE/cna2XLiW7uA/s320/Pantallazo-enviaremail.py.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5451326198003632146&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/7584816337725303387/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/03/enviar-correo-electronico-con-python.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/7584816337725303387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/7584816337725303387'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/03/enviar-correo-electronico-con-python.html' title='Enviar correo electrónico con Python usando smtplib'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_dbPdGYD9Urg/S6bue5iZF9I/AAAAAAAAAkk/E-KUJP73DPg/s72-c/Pantallazo-*Sin+guardar+1.png" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-1243422374949324239</id><published>2010-03-20T16:11:00.002-03:00</published><updated>2010-04-18T00:00:51.328-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="ssms"/><title type='text'>ssms 0.4.4</title><content type='html'>&lt;span class=&quot;post-comment-link&quot;&gt; &lt;/span&gt;  &lt;div class=&quot;post-body entry-content&quot;&gt; &lt;p&gt;Versión 0.4.4 del conocido programa de envío de mensajes a teléfonos  celulares.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Características:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;       Compañías soportadas: Tigo, Vox, Personal.&lt;/li&gt;&lt;li&gt;      Agenda de  contactos.&lt;/li&gt;&lt;li&gt;      Liberado bajo licencia GPL.&lt;/li&gt;&lt;li&gt;       Programado con Python y Gtk+.&lt;/li&gt;&lt;li&gt;Sólo para Linux.&lt;/li&gt;&lt;li&gt;Instalador gráfico.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://sourceforge.net/projects/ssms/files/ssms-0.4.4.tar.bz2/download&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Descarga&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://ssms.sourceforge.net/&quot;&gt;Página oficial&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://sourceforge.net/projects/ssms/&quot;&gt;Página del proyecto en  sourceforge&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/1243422374949324239/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/03/version-0.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/1243422374949324239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/1243422374949324239'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/03/version-0.html' title='ssms 0.4.4'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-2788073415762139616</id><published>2010-03-17T22:21:00.003-03:00</published><updated>2010-03-17T22:27:24.567-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="ssms"/><title type='text'>ssms 0.4.3</title><content type='html'>Versión 0.4.3 del conocido programa de envío de mensajes a teléfonos celulares.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Características:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;      Compañías soportadas: Tigo, Vox, Personal.&lt;/li&gt;&lt;li&gt;      Agenda de contactos.&lt;/li&gt;&lt;li&gt;      Liberado bajo licencia GPL.&lt;/li&gt;&lt;li&gt;      Programado con Python y Gtk+.&lt;/li&gt;&lt;li&gt;Sólo para Linux.&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://sourceforge.net/projects/ssms/files/ssms-0.4.3.tar.bz2/download&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Descarga&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://ssms.sourceforge.net/&quot;&gt;Página oficial&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://sourceforge.net/projects/ssms/&quot;&gt;Página del proyecto en sourceforge&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://sourceforge.net/projects/ssms/files/ssms-0.4.3.tar.bz2/download&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/2788073415762139616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/03/ssms-043.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/2788073415762139616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/2788073415762139616'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/03/ssms-043.html' title='ssms 0.4.3'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-5192960480870513877</id><published>2010-03-14T21:36:00.023-03:00</published><updated>2010-03-15T01:44:05.248-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="glade"/><category scheme="http://www.blogger.com/atom/ns#" term="gtk"/><category scheme="http://www.blogger.com/atom/ns#" term="gtkbuilder"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>&quot;Hola Mundo&quot; con Python y GtkBuilder</title><content type='html'>Hola, este es el primer tutorial que publico, espero con el tiempo mejorar mi calidad de redacción. Ahí va:&lt;br /&gt;&lt;br /&gt;Vamos a ver como crear un sencillo programa que muestre un botón y al hacer click en él despliegue el mensaje &quot;Hola mundo&quot;. Con este ejemplo se podrán aprender los pasos que en general se van a aplicar a cualquier otro programa hecho en Python y GtkBuilder. Hacer click en las imágenes para verlas en tamaño completo.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Herramientas necesarias:&lt;/span&gt;&lt;br /&gt;Para construir la interfaz gráfica, vamos a usar Glade, un constructor de interfaces Gtk+.&lt;br /&gt;&lt;br /&gt;Luego, necesitamos Python y los bindings de Gtk+ para Python.&lt;br /&gt;&lt;br /&gt;Para este tutorial vamos a usar un IDE llamado Geany, que destaca por lo liviano y rápido que resulta.&lt;br /&gt;&lt;br /&gt;Para instalar todo esto de una vez, en Debian/Ubuntu, simplemente ejecutamos el comando &quot;sudo apt-get install python python-gtk2 glade geany&quot; (sin comillas) en una consola. En Arch: &quot;sudo pacman -Sy python pygtk glade geany&quot;.&lt;br /&gt;&lt;br /&gt;(Nota: si usás Debian, asegurate de tener Squeeze para adelante para que te sirva el tutorial. Debian Lenny tiene versiones muy antiguas de glade, python y python-gtk y algunas cosas podrían ser diferentes).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Diseño de la interfaz:&lt;/span&gt;&lt;br /&gt;Luego de instalar todo lo necesario, vamos a diseñar la interfaz de usuario de nuestra aplicación. Para eso, abrimos Glade.&lt;br /&gt;&lt;br /&gt;En esta ventana dejamos las opciones como en la imagen y damos click a Cerrar:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S52JcSa-2MI/AAAAAAAAAi8/-FOBbd68pS0/s1600-h/Pantallazo-Preferencias+de+Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 316px;&quot; src=&quot;http://3.bp.blogspot.com/_dbPdGYD9Urg/S52JcSa-2MI/AAAAAAAAAi8/-FOBbd68pS0/s320/Pantallazo-Preferencias+de+Sin+guardar+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448662243262519490&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ahora se nos presenta la pantalla principal de Glade:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52J_1nGXdI/AAAAAAAAAjE/rLwE9i4BmIQ/s1600-h/Pantallazo-Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 210px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52J_1nGXdI/AAAAAAAAAjE/rLwE9i4BmIQ/s320/Pantallazo-Sin+guardar+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448662854004006354&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Creamos la ventana principal para nuestro programa, para eso hacemos click en la herramienta Ventana, el resultado es el siguiente:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52MxD_aPjI/AAAAAAAAAjM/96kQ-3MAMKw/s1600-h/Pantallazo-*Sin+guardar+1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 211px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52MxD_aPjI/AAAAAAAAAjM/96kQ-3MAMKw/s320/Pantallazo-*Sin+guardar+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448665898700914226&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ahora agregamos una botonera (el lugar en donde van los botones) de un solo elemento y dentro de el espacio que se crea en nuestra ventana principal agregamos un botón:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52O0zqT_6I/AAAAAAAAAjU/1YsFZDcyg_w/s1600-h/Pantallazo-*Sin+guardar+1-1.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 205px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52O0zqT_6I/AAAAAAAAAjU/1YsFZDcyg_w/s320/Pantallazo-*Sin+guardar+1-1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448668162060189602&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Seleccionamos el botón y en la caja de propiedades, bajo la pestaña General, le ponemos por nombre &quot;boton&quot; y luego buscamos la propiedad Etiqueta y le cambiamos lo que tenga por &quot;Click aquí&quot;:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52QSP28dBI/AAAAAAAAAjc/xGEZEisxpMM/s1600-h/Pantallazo-*Sin+guardar+1-2.png&quot;&gt;&lt;img style=&quot;float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 208px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52QSP28dBI/AAAAAAAAAjc/xGEZEisxpMM/s320/Pantallazo-*Sin+guardar+1-2.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448669767357199378&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Como se puede ver, lo que vaya en la propiedad Etiqueta es el texto que va a tener el botón. El nombre que lo pusimos (&quot;boton&quot;) nos va a servir para poder referirnos al boton y programarlo en el momento de escribir el código. Podemos ponerle cualquier nombre, lo que no es posible es dar a dos elementos distintos de la interfaz el mismo nombre.&lt;br /&gt;&lt;br /&gt;Vamos a la pestaña Señales de las propiedades de nuestro botón, y en la señal &quot;clicked&quot; seleccionamos el manipulador &quot;on_boton_clicked&quot; (enseguida explico esto):&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52TlGPmb6I/AAAAAAAAAjk/4DlLA9f4FDE/s320/Pantallazo-*Sin+guardar+1-3.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 208px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52TlGPmb6I/AAAAAAAAAjk/4DlLA9f4FDE/s320/Pantallazo-*Sin+guardar+1-3.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;A continuación vamos a crear la ventana a mostrarse al hacer click en el botón. Para eso, creamos una nueva ventana de la misma manera en la que creamos la ventana principal y dentro de ella insertamos una etiqueta con la herramienta Etiqueta:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52WSqGDyMI/AAAAAAAAAjs/gxPbErW5dog/s1600-h/Pantallazo-*Sin+guardar+1-4.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 208px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52WSqGDyMI/AAAAAAAAAjs/gxPbErW5dog/s320/Pantallazo-*Sin+guardar+1-4.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448676371469682882&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Cambiamos el texto de la propiedad Etiqueta de nuestra etiqueta por  &quot;Hola Mundo&quot;, bajo la pestaña General de sus propiedades:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52XVDRFFSI/AAAAAAAAAj0/8N2iaCVUkbI/s1600-h/Pantallazo-*Sin+guardar+1-5.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 248px; height: 320px;&quot; src=&quot;http://1.bp.blogspot.com/_dbPdGYD9Urg/S52XVDRFFSI/AAAAAAAAAj0/8N2iaCVUkbI/s320/Pantallazo-*Sin+guardar+1-5.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448677512098157858&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Solo para hacer más fácilmente entendible todo, le cambiamos los nombres a las ventanas. Le ponemos &quot;ventanaprincipal&quot; a lo que era window1 y &quot;ventanamensaje&quot; a lo que era window2:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52Y9mMcNTI/AAAAAAAAAj8/Q9ThwS8Htms/s1600-h/Pantallazo-*Sin+guardar+1-6.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 208px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S52Y9mMcNTI/AAAAAAAAAj8/Q9ThwS8Htms/s320/Pantallazo-*Sin+guardar+1-6.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448679308180337970&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Por último, le damos el manipulador &quot;on_ventanaprincipal_destroy&quot; a la señal destroy de nuestra ventana principal:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52ZtyWl5XI/AAAAAAAAAkE/fDc9WIiYJ6I/s1600-h/Pantallazo-*Sin+guardar+1-7.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 270px; height: 320px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52ZtyWl5XI/AAAAAAAAAkE/fDc9WIiYJ6I/s320/Pantallazo-*Sin+guardar+1-7.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448680136077862258&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Los manipuladores son la forma de llamar a las señales de cada elemento de nuestro programa a la hora de escribir el código. Por ejemplo, cuando programemos el manipulador &quot;on_ventanaprincipal_destroy&quot;, estaremos dando las instrucciones a ser ejecutadas al momento de cerrar (destruir) la ventana principal de nuestro programa; cuando se cierre la ventana principal esta da la señal &quot;destroy&quot; y se ejecuta lo que hayamos programado en su manipulador. Lo mismo pasa con el boton, cuando se haga click en el este da la señal &quot;clicked&quot; y se ejecuta el código que escribamos en su manipulador. (Nota: esto es lo que aprendí y me funciona, y creo que se acerca mucho a lo que realmente sucede, pero podría no ser realmente la explicación más correcta sobre las señales y los manipuladores).&lt;br /&gt;&lt;br /&gt;Antes de pasar al código en sí, guardamos nuestra interfaz como &quot;mundo.xml&quot; en el formato GtkBuilder. Para eso nos vamos a Archivo-Guardar Como y le damos &quot;mundo.xml&quot; como nombre a nuestro archivo, seleccionamos GtkBuilder en formato de archivo y damos click en Guardar.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Código del programa:&lt;/span&gt;&lt;br /&gt;Ahora pasamos a la parte más importante de cualquier programa: su código.&lt;br /&gt;&lt;br /&gt;Abrimos Geany:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52k7ejb9vI/AAAAAAAAAkM/VfFJCjSGtFM/s1600-h/Pantallazo-sin+t%C3%ADtulo+-+Geany.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 242px;&quot; src=&quot;http://4.bp.blogspot.com/_dbPdGYD9Urg/S52k7ejb9vI/AAAAAAAAAkM/VfFJCjSGtFM/s400/Pantallazo-sin+t%C3%ADtulo+-+Geany.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448692465909102322&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Ahora comenzamos a escribir el código:&lt;br /&gt;&lt;br /&gt;Primero importamos los módulos que vamos a utilizar:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import gtk&lt;br /&gt;import pygtk&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ahora creamos una clase que llamaremos &quot;mundo&quot;, que va a contener los elementos del programa y las instrucciones que le vamos a dar a cada uno de los manipuladores de las señales, y comenzamos a importar los elementos de nuestra interfaz gráfica:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class mundo:&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def __init__(self):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;b= gtk.Builder()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;b.add_from_file(&quot;mundo.xml&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.ventanaprincipal = b.get_object(&quot;ventanaprincipal&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.boton = b.get_object(&quot;boton&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.ventanamensaje = b.get_object(&quot;ventanamensaje&quot;)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;b.connect_signals(self)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.ventanaprincipal.show()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Explicando línea por línea: primero se crea la clase, luego se define el &quot;constructor&quot;. Dentro del mismo, agregamos el archivo &quot;mundo.xml&quot; que habíamos creado, y empezamos a importar de ese archivo cada uno de los elementos de nuestra interfaz. Después eso se conectan las señales y se muestra la ventana principal.&lt;br /&gt;&lt;br /&gt;Vamos a definir ahora qué se hace al dar click al botón:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def on_boton_clicked(self, widget, data=None):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;self.ventanamensaje.show()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Simplemente se muestra la ventana &quot;ventanamensaje&quot;, que contiene el texto &quot;Hola Mundo&quot; al hacer click en el botón.&lt;br /&gt;&lt;br /&gt;Ahora definimos qué hacer cuando se cierre la ventana principal:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;def on_ventanaprincipal_destroy(self, widget, data=None):&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;gtk.main_quit()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Esto indica que termina el programa.&lt;br /&gt;&lt;br /&gt;Por último, iniciamos la clase y el método gtk.main(), que se encarga de recibir las señales de los elementos de nuestra interfaz. Con estas dos líneas se da inicio al programa:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mundo()&lt;br /&gt;gtk.main()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Guardamos el archivo como &quot;mundo.py&quot; en la misma carpeta en la que está el archivo &quot;mundo.xml&quot; creado anteriormente y lo ejecutamos directamente desde Geany presionando F5:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S525VHaixUI/AAAAAAAAAkU/kwov2bX3Zzc/s1600-h/Pantallazo.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;&quot; src=&quot;http://2.bp.blogspot.com/_dbPdGYD9Urg/S525VHaixUI/AAAAAAAAAkU/kwov2bX3Zzc/s400/Pantallazo.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5448714896606938434&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Al ejecutar el programa aparece la ventana principal con un botón. Al presionar el botón aparece otra ventana con el texto &quot;Hola Mundo&quot;. Todo tiene una apariencia bastante mala, y vamos a ver en el siguiente tutorial como mejorar ese aspecto.</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/5192960480870513877/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/03/hola-mundo-con-python-y-gtkbuilder.html#comment-form' title='27 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/5192960480870513877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/5192960480870513877'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/03/hola-mundo-con-python-y-gtkbuilder.html' title='&quot;Hola Mundo&quot; con Python y GtkBuilder'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_dbPdGYD9Urg/S52JcSa-2MI/AAAAAAAAAi8/-FOBbd68pS0/s72-c/Pantallazo-Preferencias+de+Sin+guardar+1.png" height="72" width="72"/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1383021601049255291.post-6224060017886607567</id><published>2010-03-14T21:06:00.000-03:00</published><updated>2010-03-14T21:11:00.344-03:00</updated><title type='text'>¡Welcome!</title><content type='html'>La intención de este blog es compartir lo que aprendí sobre Python y Gtk+ en una serie de tutoriales.&lt;br /&gt;&lt;br /&gt;Fui prácticamente autodidacta en programación -lo que se nota bastante en mi forma de programar- y me queda muchísimo por aprender, así que mis tutoriales no van a ser de un nivel avanzado (al menos no en un principio), y estoy abierto a todas las críticas/comentarios/sugerencias que pueden surgir.</content><link rel='replies' type='application/atom+xml' href='http://pitonpy.blogspot.com/feeds/6224060017886607567/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://pitonpy.blogspot.com/2010/03/welcome.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/6224060017886607567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1383021601049255291/posts/default/6224060017886607567'/><link rel='alternate' type='text/html' href='http://pitonpy.blogspot.com/2010/03/welcome.html' title='¡Welcome!'/><author><name>ito123456789</name><uri>http://www.blogger.com/profile/06972467613069241312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_dbPdGYD9Urg/S9yVl5mHSEI/AAAAAAAAAoo/iQ-FRdScrZ0/S220/2010-05-01-165621.jpg'/></author><thr:total>5</thr:total></entry></feed>