sábado, 27 de noviembre de 2010

Primeros pasos con pygtk

Pues bien, hoy estuve picando código en pygtk, buscando respuestas en google, cuestionando a un experto conocido mío y por fin logré mi cometido:
 Mi idea fue elaborar una pequeña aplicación que manejara ventanas, la idea es muy simple:
- una ventana con dos botones

   - un botón abre una ventana nueva sin ocultar la ventana que la llamó

   - otro botón abre una ventana nueva ocultando la ventana que la llamó


Sí, lo sé, algo simple, pero para mí significó un gran esfuerzo por tratar de comprender cómo funciona este mundillo de programación con pygtk.

A continuación pongo el código, creo yo que está lo suficientemente bien documentado, pero si tienen alguna duda, comentario o sugerencia, no duden en contactarme; o si lo prefieren, pueden descargar el fichero desde aquí.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

class Base:
# esta función es para conectar a la señal cuando cierro la ventana 
# desde la "x" para salir de la aplicación
def delete_event(self, widget, data=None):
gtk.main_quit()
return False
# esta función es para "ocultar" la ventana principal "mwindow" y
# está conectada a la señal "clicked" del botón "Con Cerrar"
def ocultar_ventana(self, widget, mwindow):
mwindow.hide()

# esta función es para mostrar la ventana oculta por la función
# "ocultar_ventana" y está conectada a la función "clicked" del
# botón "OK"
def mostrar_ventana(self, widget, mwindow):
mwindow.show()

# esta función es llamada por el ciclo principal "__init__" 
def abrir_ventana(self):
# la ventana principal modal, para evitar que abran más de una ventana
# conectada a la función "delete_event" para salir de la aplicación
mwindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
mwindow.connect("delete_event", self.delete_event)
mwindow.set_modal(True)
mwindow.set_size_request(225,25)
mwindow.set_resizable(False)
mwindow.move(500,300)
mwindow.set_title("Ventana Principal")
# caja principal que contiene a los botones
box1 = gtk.HBox(True, 0)
# añado la caja a la ventana
mwindow.add(box1)
# primer botón, con la etiqueta "Sin Cerrar" conectada a la
# función "ventana_nueva" pasando como argumento "mwindow"
# para poder ocultarla o mostrarla según sea el caso
boton1 = gtk.Button("Sin Cerrar")
boton1.connect("clicked", self.ventana_nueva, mwindow)
boton1.show()
#empaquetado del botón en la caja principal
box1.pack_start(boton1, True, True, 0)
# segundo botón, con la etiqueta "Con Cerrar" conectada a la
# función "ventana_nueva" y a su vez a "ocultar_ventana"
# pasando como argumento a ambas funciones "mwindow"
# para poder ocultarla o mostrarla según sea el caso
boton2 = gtk.Button("Con Cerrar")
boton2.connect("clicked", self.ventana_nueva, mwindow)
boton2.connect("clicked", self.ocultar_ventana, mwindow)
boton2.show()
# empaquetado del botón en la caja principal
box1.pack_start(boton2, True, True, 0)
# mostrar la caja principal
box1.show()
# mostrar la ventana principal
mwindow.show()
# esta función destruye la ventana secundaria al darle click 
# en el botón "OK", recibe "window" como argumento para saber
# qué ventana cerrar
def cerrar_ventana(self, button, window):
window.destroy()
# esta función crea la ventana secundaria y recibe como argumento
# "mwindow" para mostrar la ventana principal al clickear el
# botón "OK"
def ventana_nueva(self, widget, mwindow):
# la ventana secundaria modal, para evitar que abran más de una ventana
# conectada a la función "delete_event" para salir de la aplicación
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("delete_event", self.delete_event)
window.set_modal(True)
window.set_size_request(225,25)
window.set_resizable(False)
window.move(500,350)
window.set_title("Ventana Secundaria")
# caja principal que contiene a los botones
box1 = gtk.HBox(True, 0)
# añado la caja a la ventana
window.add(box1)
# botón "OK" para mostrar la ventana principal pasando como
# argumento "mwindow" a la función "mostrar_ventana" y
# "window" a la función "cerrar_ventana" para cerrar
# la ventana secundaria
boton1 = gtk.Button("OK")
boton1.connect("clicked", self.mostrar_ventana, mwindow)
boton1.connect("clicked", self.cerrar_ventana, window)
boton1.show()
# empaquetado del botón en la caja principal
box1.pack_start(boton1, True, True, 0)
# mostrar la caja principal
box1.show()
# mostrar la ventana secundaria
window.show()
def __init__(self):
# llamo a la función para abrir la ventana principal
self.abrir_ventana()

def main(self):
# inicio el ciclo principal de gtk
gtk.main()
if __name__ == "__main__":
base = Base()
base.main()

No hay comentarios.:

Publicar un comentario