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