viernes, 23 de abril de 2010

Nota Python: Intro PyGTK

"GTK+ o The GIMP Toolkit es un conjunto de bibliotecas multiplataforma para desarrollar interfaces gráficas de usuario (GUI), principalmente para los entornos gráficos GNOME, XFCE y ROX aunque también se puede usar en el escritorio de Windows, MacOS y otros. GNOME está basado en GTK+, lo que significa que los programas de GNOME usan GTK+." (wikipedia)
PyGTK es un binding de la biblioteca gráfica GTK para el lenguaje de programación Python.

Gtk está basado en contenedores, lo que implica que un widget no se dice donde se ubica, no es necasrio el uso de coordenadas, si no que se dice que en que contenedor está el widget. Agunos widgets (como una ventana, un botón...) son contenedores que sólo pueden almacenar un único widget (un botón solamente almacena la etiqueta). Si se necesitase poner más de un widget en un contenedor de este tipo (por ejemplo una ventana), se debería poner un contenedor que permitiese más de un widget (por ejemplo una caja).

Los widgets GtkHBox y GtkVBox son contenedores que admiten más de un widget. GtkHBox y GtkVBox son cajas invisibles que empaquetan widgets horizontal o verticamente respectivamente.

La siguiente imagen muestra una ventana que contiene una caja vertical, esta a su vez contiene dos botones.


Ejemplo en ubuntu 10.04:



Para crear la ventana anterior en pygtk hay que hacer lo siguiente:


#objects
window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
caja = gtk.VBox(False, 0) 
hello_button = gtk.Button("Say hello") 
bye_button = gtk.Button("Say bye") 

#add widgets
caja.pack_start(hello_button, True, True, 0) 
caja.pack_start(bye_button, True, True, 0) 
window.add(self.caja) 

#show widgets
hello_button.show() 
bye_button.show() 
caja.show() 
window.show()

Cuando se ejecuta un program en gtk se debe ejecutar el bucle main. Este bucle main se encarga de recoger los eventos y las señales. Para que se ejecute este bucle en PyGTK, hay que ejecutar la función:

gtk.main()

Para salir de dicho bucle hay que ejecutar la función:

gtk.main_quit()

Para recoger los eventos o las señales es necesario “conectar” los widgets. A continuación se muestra como se “conectan” los botones a las funciones “callback” para la señal "clicked":

hello_button.connect("clicked", callback1) 
bye_button.connect("clicked", callback2) 

A continuación se muestra un pequeño ejemplo basado en la ventana con dos botones que se ha mostrado anteriormente. Aparte de las señales de los botones, también se ha “conectado” la ventana principal para que al cerrarse la ventana se termine el programa("delete_event", "destroy")

#!/usr/bin/python 

import pygtk 
import gtk 

class HelloWorld(): 

    def delete_event(self, widget, event): 
        return False    

    def destroy(self, widget): 
        gtk.main_quit() 

    def __init__(self): 
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
        self.caja = gtk.VBox(False, 0) 
        self.hello_button = gtk.Button("Say hello") 
        self.bye_button = gtk.Button("Say bye") 
        
        self.caja.pack_start(self.hello_button, True, True, 0) 
        self.caja.pack_start(self.bye_button, True, True, 0) 
        self.window.add(self.caja) 

        self.window.connect("delete_event", self.delete_event) 
        self.window.connect("destroy", self.destroy) 
        self.hello_button.connect("clicked", self.b_click, 1) 
        self.bye_button.connect("clicked", self.b_click, 2) 

        self.hello_button.show() 
        self.bye_button.show() 
        self.caja.show() 
        self.window.show() 

    def b_click(self, widget, data): 
        if data == 1: 
            print "Hello World!" 
        else: 
            print "Bye" 

    def main(self): 
        gtk.main() 


if __name__ == "__main__": 
    hello = HelloWorld() 
    hello.main() 

No hay comentarios:

Publicar un comentario