Sencillo Hola mundo en Pygtk.

Hola a tod@s de nuevo, en el anterior tutorial halábamos sobre la estructura básica de un programa en PyGtk, hoy vamos a ir un poquito más haya, vamos a crear dentro de una ventana, un botón y que al presionar ese botón repetidamente, nos muestre por consola "hola".

También vamos a añadir la opción de poder cerrar la ventana cerrando en la X de nuestro gestor de ventanas, algo que en el anterior ejemplo no podíamos.



Lo primero es familiarizarse con el concepto de señales, los widgets emiten señales que son recogidas por un manejador de señales, el cual después apunta a X función.

El código sería algo así:


#!/usr/bin/python2

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

class Base:
 def hola(self, widget, data="None"):
  print "hola"

 def cerrar_aplicacion(self, widget):
  print "se ha cerrado la aplicacion"
  gtk.main_quit()

 def __init__(self):

  self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
  self.w.connect("destroy", self.cerrar_aplicacion)
  self.w.set_title("Ventana de prueba")
  self.w.set_border_width(15)

  self.button=gtk.Button("presiona aqui")
  self.button.connect("clicked", self.hola)

  self.w.add(self.button)

  self.w.show()
  self.button.show()

 def principal(self):
  gtk.main()

if __name__ == "__main__":
 base = Base()
 base.principal()


La función "hola" creada dentro de la clase Base, es una retrollamada, a la cual accederemos conectando los diferentes elementos, (en este caso un botón), a la función.

Después crearemos la función "cerrar_aplicación" que simplemente nos avisa de que la aplicacion se ha cerrado y luego la cierra.

Hasta aquí es fácil, ahora, en la linea 18, usamos el método connect para conectar nuestra ventana con la función cerrar_aplicación, esta última función se activará si a la ventana le llega la señal "destroy", es decir, cuando intentamos cerrar con la X.

Las lineas 19 y 20 solo son para dar formato, la 19 para establecer un titulo a la ventana (se debe de redimensionar para que se vea correctamente) y la 20 para establecer el margen.

En la linea 22 creamos un botón con el texto interior "presiona aqui" y en la linea 23 lo conectamos con la función hola, la cual se activará si el botón envía la señal "clicked", es decir, si se presiona el botón.

Después en la linea 25 añadimos el botón a la ventana y con las lineas 27 y 28 mostramos tanto el botón como la ventana.

Para ver el mensaje que nos da el botón, tenemos que abrir un terminal y ejecutarlo con "./prueba", ya que el mensaje se nos da por la terminal, así que ejecutamos la aplicación, y si por ejemplo le damos 5 veces al botón, nos dirá 5 veces "hola" en la terminal, algo así:



Después para cerrarla, pulsamos la X como en cualquier otra aplicación, se nos cerrará y en la consola se nos notificará el cierre:



Bueno, y hasta aquí el tutorial de hoy, poco a poco vamos avanzando, ya sabéis que si tenéis alguna duda no tenéis nada más que preguntarme en los comentarios, un abrazo a tod@s y hasta el siguiente tutorial.

55 comentarios:

Francisco Dominguez Lerma dijo...

Estoy esperando que alguien responda para saber si puedo seguir, si lo habéis entendido o no para seguir avanzando.

Un saludo.

Dan dijo...

Franciosco , estoy teniendo unos problemas y no puedo seguir con lo del python , si te parece bien esperar 3 o 4 dias hasta que se solucione te lo agradeceria.

Francisco Dominguez Lerma dijo...

Vale Dan, no te preocupes.

Saludos.

Dan dijo...

ya tengo internet este fin de semana lo pruebo

Dan dijo...

Francisco me da errores y no se ejecuta:
... if __name__ == "__main__":
File "", line 28
if __name__ == "__main__":
^
SyntaxError: invalid syntax
>>> base = Base()
File "", line 1
base = Base()
^
IndentationError: unexpected indent
>>> base.principal()
File "", line 1
base.principal()
^
IndentationError: unexpected indent
>>>

Francisco Dominguez Lerma dijo...

Dan, el código está probado tal cual está en el post, el código en si no tiene ningún error.

Comprueba de que hayas copiado bien el código y escríbelo a mano, ya que de lo contrario puede dar error de indentación.

Saludos.

Dan dijo...

vale , ya lo pruebo

Dan dijo...

Francisco he tenido que reformar el codigo para poder ejecutarlo a mano
te paso el codigo que me ha dado:

>>> import pygtk
>>> import gtk
>>> pygtk.require('2.0')
>>>
... class Base:
... def hola(self, widget, data="None"):
... print "hola"
...
... def cerrar_aplicacion(self, widget):
... print "se ha cerrado la aplicacion"
... gtk.main_quit()
...
>>> def __init__(self):
... self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
... self.w.connect("destroy", self.cerrar_aplicacion)
... self.w.set_title("Ventana de prueba")
... self.w.set_border_width(15)
... self.button=gtk.Button("presiona aqui")
... self.button.connect("clicked", self.hola)
... self.w.add(self.button)
... self.w.show()
... self.button.show()
...
>>> def principal(self):
... gtk.main()
...
>>> if __name__ == "__main__":
... base = Base()
... base.principal()
...
Traceback (most recent call last):
File "", line 3, in
AttributeError: Base instance has no attribute 'principal'
>>>

Dime que pasa porfa???

Francisco Dominguez Lerma dijo...

Hola Dan.

Acabo de probar el código que está posteado y funciona tal cual está ahí.

Acabo de poner el código en pastebin para ver si copiandolo de allí no da problemas, Código en pastebin

Copialo de donde pone "RAW Paste Data" si no no funciona ya que en el de arriba mete muchos espacios que dan conflictos.

Como ya te digo acabo de probar el código que está en el artículo y funciona al 100% sin darme ningún error, así que lo es el código en sí esta bien, en lo que tú me has puesto es normal que no funcione por que los métodos __init__ y principal no están dentro de la clase y por lo tanto no los reconoce como métodos de base, por lo tanto cuando la llama tira ese error.

Si aún copiándolo y pegándolo tal cual te lo he puesto en pastebin no funciona, tal vez sea algo relacionado con la versión de python,yo he puesto "#!/usr/bin/python2" por que tambien tengo instalado python3, pero prueba a poner python solo, o al revés, si has puseto python pon python2.

Dan dijo...

sigue fallando y lo he copiado de donde pone raw y eso

Francisco Dominguez Lerma dijo...

Pues que raro, es más, por si acaso era fallo mio, le he pasado el enlace a un amigo para que lo probara y a él también le funciona sin problemas.

Tal vez es que no hayas instalado pygtk, o sea algún error de tu distro no lo se, no tengo ni idea sinceramente, por que ya digo que el código está mas que probado.

Saludos.

Dan dijo...

ya lo mirare , gracias por todo

Dan dijo...

francisco , me podrias decir como hacer un programa al q le des
8
7
5
8
y te los ordene en clasificacion
8 - 2
7 - 1
5 - 1
Gracias , q sea en linea de comandos
pasate por mi web y me cuentas q tal es que no se si lo estoy haciendo bien
liberadalinux.wordpress.com

Francisco Dominguez Lerma dijo...

Hola Dan, acabo de escribir el programa y esta probado así que funciona, te lo he subido a pastebin, espero que sea esto lo que buscas:

Código en pastebin

Un saludo

Dan dijo...

Muchas gracias ya me lo estoy mirando , oye hace tiempo escribiste un post para leer y escribir en un txt desde python ,
existiria algun modo de hacer esto
a=int(input("numero"))
file=open("f1.txt", "a")
file.write(a)
solo con poner esto me sale esto:
Traceback (most recent call last):
File "", line 1, in
TypeError: argument 1 must be string or read-only character buffer, not int

Gracias y ya si me puedes decir eso mejor aun

Dan dijo...

francisco en el codigo de ordenar numeros como se puede cambiar para que se puedan meter numeros de dos cifras es decir 16 18 pero tambien de una 6 9
Gracias

Tuus dijo...

Hola Francisco,

Bueno me ha llevado un tiempo. Pero a base de ratos he conseguido seguir todos los tutoriales (salvo los de los juegos) y llegar hasta el ultimo.

Me han sido de gran ayuda, muchas gracias. Espero que te animes y sigas con pygtk. Si no tendré que buscar otro sitio ;)

Francisco Dominguez Lerma dijo...

Me alegro Tuus de que te hayan sido de ayuda, a ver si me pongo un ratito y continúo con los tutoriales.

Un saludo.

Dan dijo...

francico el codigo de pastebin como se puede reformar para q se puedan meter numeros de una y dos cifras , gracias

Dan dijo...

hola , siento no haber vuelto antes es que tenia examenes , yo lo del gtk no lo veo , tengo problemas con ello ademas de que no se si me interesa mucho igual podrias dividir el blog en secciones o no se , yo habia pensado que igual podriamos trabajar la programacion de python en raspberry pi o arduino.
q te parece??
o si no volver a tkinter xp lo del pygtk no me va aunque se me ha ocurrido una solucion.

Dan dijo...

ya lo he intentado con 3 distros
linux mint , ubuntu y gnewsense
y no hay manera me falla en las ultimas lineas volvamos al tkinter xp yo asi no puedo programar
espera voy a instlarlo en la raspberry pi

Dan dijo...

con la raspberry tampoco no lo tiene instalado y en los repositorios de la raspberry y de mis distros de pc no hay ningun paquete llamado pygtk
ya lo siento
por cierto q piensas de lo de raspberry pi y arduino??

Francisco Dominguez Lerma dijo...

Hola Dan, es muy raro lo que te sucede con el programa en python... además eso es independiente de la distro... debería funcionar en cualquier distro que tuviese python y gtk instalado...

En cuanto a que no está en los repos, por ejemplo, en debian está en los repos, mira este enlace: Pygtk en debian

Respecto a lo de la raspberry pi, no me parece mala idea, solo hay una pega, que no tengo una XD, me interesa comprarla pero aún no la tengo, de todas formas, deberías de intentar arreglar de alguna forma el error que te da, ya que es muy muy raro.

Perdona si no posteo mucho últimamente, estoy también liado ya que estoy intentando crear un pequeño server con un portatil antiguo que tengo para poner una web de temática GNU.

Un saludo y espero que lo soluciones.

Dan dijo...

lo he estado mirando y parece
que esta bien instalado pero
el codigo no me va sin embargo
si le realizo una pequeña reforma
si que va pero falla en lo ultimo
en lo de noseque==noseque o algo asi
yo decia volver a tkinter que si me va yo ya no se voy a probar manjaro y si ay no me va el gtk lo dejo ya que si algo no te funciona es que no es para ti.
DE todas formas gracias por todo
puedes encontrarme en liberadalinux.wordpress.com dalmemail@gmail.com y queria decirte ¿no creaste una pagina de facebook de aprendepython? no la encuentro

Francisco Dominguez Lerma dijo...

No Dan, este blog nunca ha tenido ninguna página en facebook, solo una cuenta de twitter.

Un saludo.

Dan dijo...

pues yo juraria a ver visto una de todas formas da igual pero ¿oodriamos volver con TKinter??
por cierto puedes ver mi canal de youtube en youtube.com buscando dan rulos ahi tengo videos sobre la raspi y proximamente arduino

Dan dijo...

francisco hazme un favor escribe un post de colisiones en pygame es decir que cuando choquen dos elementos uno desaparecca sea eliminado o pase algo porfavor ponblo , gracias.

Dan dijo...

hola franciasco veras e instalado pygtk en manjaro linux con el sudo pacmac -S pygtk (lo que pusiste en un post) y mira :
[dalme3@dalme3 ~]$ pacman -S pygtk
error: no puede realizar esta operación, a menos que sea root.
[dalme3@dalme3 ~]$ sudo pacman -S pygtk
[sudo] password for dalme3:
:: Los siguientes paquetes deben actualizarse primero:
manjaro-system pacman
:: ¿Desea cancelar la operación actual
:: y actualizar estos paquetes ahora? [S/n] n

atención: pygtk-2.24.0-3 está actualizado -- re-instalando
resolviendo dependencias...
verificando conflictos...

Paquetes (1): pygtk-2.24.0-3

Tamaño Total de Descarga: 1,56 MiB
Tamaño Total Instalado: 17,38 MiB
Tamaño neto a actualizar: 0,00 MiB

:: ¿Continuar con la instalación? [S/n] s
:: Recuperando paquetes ...
pygtk-2.24.0-3-i686 1598,4 KiB 525K/s 00:03 [######################] 100%
(1/1) verificando llaves en el llavero [######################] 100%
(1/1) verificando la integridad de los paquetes [######################] 100%
(1/1) cargando los archivos del paquete... [######################] 100%
(1/1) verificando conflictos entre archivos [######################] 100%
(1/1) verificando el espacio disponible en disco [######################] 100%
(1/1) reinstalando pygtk [######################] 100%
[dalme3@dalme3 ~]$ python
Python 3.3.2 (default, Sep 6 2013, 09:35:59)
[GCC 4.8.1 20130725 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygtk
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named 'pygtk'
>>> import pygtk
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named 'pygtk'
>>> import gtk
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named 'gtk'
>>>
[dalme3@dalme3 ~]$
a ver si lo arreglamos que yo tengo que volver a programar yaaa!!!! y no dejes de lado el blog porfavor yo sigo entrando este blog tiene futuro mucho futuro

Francisco Dominguez Lerma dijo...

Hola Dan, da la casualidad de que ahora mismo también estoy en manjaro y he comprobado lo que has puesto en el anterior comentario y efectivamente no funciona.

Cuando haces "import gtk" python intenta importar un módulo que no existe, se me pasó en el post de la instalación poner que también había que hacer un "pacman -S gtk" y así se instala gtk y no dará ese error.

Pero ojo, si después de eso haces "python" y empiezas "import gtk" y "import pygtk" no los importará por que en manjaro al hacer "python" entras en el intérprete de python 3, y por algún motivo en python 3 he comprobado que no se importan, tal vez no sean compatibles, por lo que debes hacer "python2" en vez de "python".

En resumen, instala el paquete "gtk" que es lo que te falta con "pacman -S gtk" (como root), y entra en el intérprete con "python2".

Además también fíjate que en este post, la linea shebang (la primera linea) pone "#!/usr/bin/python2" y no "#!/usr/bin/python" ya que debe de abrirse con python2 y no con python 3.

Respecto al blog, intentaré pasarme más a menudo, no estoy pasando por un buen momento pero lo intentaré.

Un saludo y espero haberte ayudado.

Dan dijo...

gracias ya lo he echo y va pero me da un error en la penultima linea
Base() is not defined
como lo arreglo????

Dan dijo...

ya lo he ejecutado!!!!
he tenido que hacer reformas pero bueno , publica mas post pofa.
por cierto cual es tu web de gnu???

Francisco Dominguez Lerma dijo...

¡¡ Me alegra de que lo hayas arreglado Dan !!

En cuanto al blog, intentaré postear algo, pero no estoy por mi mejor momento personal.

Mi web de GNU es: ComunidadGNU

Saludos.

Dan dijo...

francisco tu web no me carga ni a un amigo mio ni al creador de libuntu.com seguro que es comunidadgnu.no-ip.org???

Francisco Dominguez Lerma dijo...

Si, vuelve a darle al enlace, es que había apagado el server, sorry, es un server casero y como aún está en proceso la creación de la página a veces apago el server.

Un saludo.

Dan dijo...

es un server casero??? y como lo tienes hazlo coon una raspberry pi que consume poco y lo de no-ip eso que es ??? muy buena web pon alguna cosa mas pero no tengas prisa pasame lo de la web en server casero y lo hago con la raspi y cuando puedas seguimos con pygtk que no lo entiendo muy bien pero me adaptare sigue con estemagnifico blog!!! tu me distes las ganas de propgramar y la paciencia para que lo aprendiera y no quiero dejarlo pero sin tu ayuda no se hacer nada nuevo este blog es mi unica ayuda que los demas no son muy buenos , bueno sino pones mas mirare algo con python-tk o no se como se instala tkinter en python2 de manjaro.

Francisco Dominguez Lerma dijo...

Hola Dan, efectivamente está en un server casero, bajo debian 7, y es simple, tan sólo instalar y arrancar unos cuantos servicios como apache, php... y poner los .html en un directorio expecífico, es sencillo. Lo del no-ip, es un servicio que de forma gratuita me ofrece un dominio, y, además, me permite tener un server con ip dinámica (no he contratado ip fija), aunque existe una versión de pago de no-ip para obtener dominios sin el ".no-ip".

Si quieres montarte un server, es sencillo, te recomiendo debian, y este post: montar un server en debian paso a paso

aunque ese post esté algo desactualizado y algunas cosas tendrás que buscarlas actualizadas googleando, está muy bien, es sencillo y paso a paso.

Y para configurar no-ip (ya que en el post de antes está desactualizado), te recomiendo este post: Post de no-ip

Gracias por la sugerencia de la raspberry pi, es una buena idea ya que consume muy poco.

Un saludo y espero que te sirva de ayuda.

Dan dijo...

muchas gracias ya lo ire mirando y ya sabes cuando quieras seguimos

Dan dijo...

francisco he estado haciendo cosas en Tkinter en la raspberry pi y no se que aplicacion podria diseñar que programa crees que podria hacer???
a ser posible que valga para algo
gracias

Dan dijo...

francisco escribiste un post en el que explicabas lo de askopenfile() y eso de seleccionar archivos y al final del post pusiste que lo podiamos abrir el archivo con open()
como se hace yo he probado
archivo=askopenfile()
open(archivo, "r")
como se hace he probado de todo

Francisco Dominguez Lerma dijo...

El artículo es: Dialogos de ficheros en python

Dan dijo...

francisco ya se cual es pero dices con open() eso como se hace para que abra archivo=askopenfile()
gracias

Dan dijo...

francisco lo he echho con eso que me muestra un mensaje en una ventana pero me dice open file /home/pi/etc y unas cosas mas yo quiero que salga lo que pone en el archivo como se hace???
muchas gracias

Dan dijo...

francisco en el tutorial dieciseis de ficehros en python lo de open() y eso como se puede hacer con el modo de escritura de añadir file=open("a.txt", "a") de modo que cada vez que añadas algo se añada en diferente linea es decir si tienes hola
que sea
hola
que tal
y la proxima vez que havbras el archivo para añadir añada en una linea nueva gracias

Dan dijo...

francisco he estado hurgando con noip.com y al crear mi dominio en .no-ip.net me piden muchos datos a ti te los pedian????

Francisco Dominguez Lerma dijo...

Si Dan, es normal que te pidan bastantes datos.

Saludos.

Dan dijo...

francisco no se si sabras algo pero he creado una ppa y he estado viendo post para subir .deb pero tienes que tener un programa en .py (por ejemplo) y hacer el .deb yo lo que quiero es un deb que ya tengo (da igual de donde haya salido) poder subirlo ¿como lo hago?
GRACIAS

Francisco Dominguez Lerma dijo...

Puff..... ahí me has pillado, sinceramente no tengo ni idea de crear un ppa ni nada relacionado, se lo que es, claro, pero nada más que usarlo y poco más, lo siento.

Un saludo.

Dan dijo...

hola francisco mirate esto que he publicado y comentame que solucion se te ocurre.
http://liberadalinux.wordpress.com/2014/01/19/repositorio-para-distros-obsoletas/

Dan dijo...

oye lo de comunidadgnu.no-ip.org lo haces desde un servidor apache no???
es que he hecho un server de repositorio de software y necesito ponerlo online con apache
GRACIAS

Francisco Dominguez Lerma dijo...

Si dan, utilizo apache, pero realmente no-ip y apache son dos cosas realmente independientes.

Saludos.

Dan dijo...

Gracias , aver cuando pones un post, ya te pasare la url de mi server cuando este listo....

Dan dijo...

francisco pasame un correo electronico tuyo tengo que pasarte un par de cosas que no se deben ver aqui.
Gracias vale tu pac*******@hotmail.es??? te lo mando por ahi.

Francisco Dominguez Lerma dijo...

Hola Dan, mejor mándamelo a "francisco.dominguez.lerma@gmail.com"

Saludos.

Darknet dijo...

Hola, muy bueno el blog, tal vez este comentario no vaya aquí pero como es la última entrada del blog lo escribo: Me pareció muy interesante lo de los socket y en el ejercicio que pusiste del chat cliente/servidor funciona de maravilla. Pero nos dejaste allí! Cómo sería para tener un chat en que tanto cliente como el servidor puedan escribir y recibir ambos los mensajes? Excelente aporte al conocimiento sigue así!! Saludos

Dan dijo...

FRANCISCO!!!!!!!!!!!!
Vuelve a publicar please :(
Desde que no publicas ni siquiera uso python habitualmente, estoy desarrollando mi propio sistemas operativo : amaya os.
amayaos.wordpress.com
sf.ney/projects/amayaos