Python + PyGTK

octubre 28 2009Se el primero en comentar

Guardado en : Programaci贸n

Python aunque es un lenguage multiplataforma no posee una librer铆a para hacer aplicaciones gr谩ficas como por ejemplo lo es el AWT o Swing para java, sin embargo hay wrappers para diferentes librer铆as multiplataforma de controles o widgets para desarrollar una aplicaci贸n con interfaz, mencionar茅 algunas a continuaci贸n para despu茅s proseguir a tratar PyGTK.

La que nos interesa en este momento es pygtk que es el wrapper para acceder a gtk. Y lo haremos a travez de una aplicaci贸n en la cual dise帽aremos gr谩ficamente desde glade3.

Objetivo

Construir una aplicaci贸n que permita al usuario en una caja de texto y cuando de enter o pulse el bot贸n se cambiar谩 una etiqueta que contiene la aplicaci贸n.

Construyendo la interfaz desde glade3

Cuando abrimos la aplicaci贸n, seleccionamos estas opciones para que sea compatible con las versiones anteriores ya que el soporte para GtkBuilder es algo nuevo, esto nos indicar谩 si usamos cosas muy nuevas.

py-pygtk-00

Lo que necesitamos es crear una ventana como la siguiente que por defecto se llamara “window1″

py-pygtk-01

despu茅s agregamos un manejador vertical con 3 lugares como el que se muestra en la imagen siguiente

py-pygtk-02

Ahora agregamos una caja de entrada que por defecto se llamara “entry1″

py-pygtk-03

y tambi茅n agregamos un label que por defecto se llamara “label1″

py-pygtk-04

finalmente agregamos un bot贸n que se llamara por defecto “button1″

py-pygtk-05

Modificando los valores de las propiedades

En la parte derecha modificamos las propiedades como el texto que despliegan los controles uno a la vez de “label1″ y “button1″ para que finalmente el dise帽o quede como

py-pygtk-06

Guardando la interfaz en el formato correcto

Finalmente lo guardamos con nombre “interfaz.xml” y con los valores que tiene en ese momento el cuadro de dialogo en la carpeta donde se encuentra el archivo en python.

Pantallazo-Guardar como鈥

Conectando un evento

La programaci贸n en gtk es basada en se帽ales y eventos, un widget puede generar se帽ales y tu programa debe de conectarse a ellas en orden de poder reaccionar a cada evento, cada evento que llega a tu aplicaci贸n puede que tenga m谩s de un argumento de entrada.

Reaccionando al cierre de la ventana

La ventana de la derecha que despliega las propiedades de cada widget, tambi茅n nos muestra una p谩gina seleccionable llamada “Se帽ales” mediante la cual seleccionando window1 abres las se帽ales heredadas de GtkObject e insertas el nombre de la nueva se帽al “on_window1_destroy” en “destroy”, esto es una convenci贸n notar谩s que si empiezas con las palabras “on_” el resto de la cadena se auto-completar谩 y finalmente el nombre queda de la forma “on_” + nombre de objeto + “_” + nombre de la se帽al.

py-pygtk-conectar-00

Reaccionando al enter en la caja de texto

Se hace similar para la entry1 en su se帽al activate que es de su propia clase GtkEntry. Con esto se puede simular el click del bot贸n apretando la tecla enter.

py-pygtk-conectar-01

Reaccionando al click en el bot贸n

Se hace similar para el bot贸n button1 en su se帽al clicked que es de su propia clase GtkButton

py-pygtk-conectar-02

El c贸digo que necesitamos para reaccionar a este evento y cumplir con nuestro objetivo es el siguiente, contiene algunos comentarios para clarificar que es lo que esta pasando.

# -*- coding: utf-8 -*-
import pygtk
pygtk.require("2.0")
import gtk
 
class App:
  def __init__(self):
    # Obtenemos el objeto que lee el formato de GtkBuilder
    self.builder = gtk.Builder()
   # Le茅mos de el archivo interfaz.xml lo que hemos dise帽ado
    self.builder.add_from_file("interfaz.xml")
    # por medio de connect_signals que recibe un diccionario que contiene
    # "nombreDeLaSe帽alEnGlade3": metodoQueSeConectaYManejaLaSe帽al
    # conectamos las 3 se帽ales: cerrar la ventana, enter en el text entry
    # click en el bot贸n
    self.builder.connect_signals({
      "on_button1_clicked":self.on_button1_clicked,
      "on_window1_destroy":self.on_window1_destroy,
      "on_entry1_activate":self.on_entry1_activate
    })
    # obtenemos la ventana principal "window1" y la mostramos
    self.window1 = self.builder.get_object("window1")
    self.window1.show()
 
  def cambiarTexto(self):
    # obtenemos de la descripci贸n de la interfaz
    # aquel objeto que deseamos acceder (label1 y entry1)
    # accedemos a sus m茅todos para obtener el texto del entry1
    # y poner ese texto en el label1
    lbl = self.builder.get_object("label1")
    txtentry = self.builder.get_object("entry1")
    lbl.set_text(txtentry.get_text())
 
  def on_button1_clicked(self, evento):
    # cuando maneja la se帽al del click en el bot贸n 1, cambiarTexto
    self.cambiarTexto()
 
  def on_entry1_activate(self, evento):
    # cuando maneja la se帽al del enter en la entrada 1, cambiarTexto
    self.cambiarTexto()
 
  def on_window1_destroy(self, evento):
    # cuando maneja la se帽al de cerrar la ventana principal
    # salir del ciclo de gtk con gtk.main_quit
    gtk.main_quit()
 
def main():
  app = App()
 
if __name__ == "__main__":
  main()
  # Esto es importante, es lanzar el ciclo de eventos
  # y el kernel principal de nuestra aplicaci贸n, sin esto
  # nuestra aplicaci贸n simplemente terminar铆a sin haber mostrado nada al usuario
  # o haber reaccionado a alg煤n evento o lanzado alguno.
  gtk.main()

Ahora puedes correr la aplicaci贸n y ver como funciona. Finalmente si deseas descargar el c贸digo anterior con todo y el archivo interfaz.xml lo puedes descargar aqu铆.

Comparte esta informaci贸n:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • LinkedIn
  • Technorati
  • TwitThis

Quiz谩 te interese :

Acerca del autor: tyoc

Deja un comentario


Licencia y uso

Las técnicas demostradas en los tutoriales pueden ser utilizadas sin ninguna limitación y tampoco es obligatorio dar una atribución.


Los textos, imágenes y tutoriales son propiedad de sus respectivos autores, nuestro contenido se encuentra bajo licencia Creative Commons Share-Alike.

Escribe algo para el sitio

El escribir un tutorial o un artículo, mandarnos un enlace para Ubicuos, no solamente es una forma de obtener publicidad, si no también de dar algo a la comunidad y nosotros te lo recompensamos con los premios del mes! Leer más de nuestras promociones

驴Sugerencias?

Este es TU sitio, si tienes sugerencias o ideas de c贸mo podemos mejorarlo para ti, 隆Por favor h谩znoslos saber!

Hacemos nuestro mayor esfuerzo en proporcionar un sitio 煤til y amigable y esperamos que disfrutes tu tiempo aqu铆.

Ayuda a Difundir

Te gusta Ubicuos?

Ve las formas en que nos puedes apoyar.

Apoyando a Ubicuos.com

Submit your linkClose