Mostrando entradas con la etiqueta pygtk. Mostrar todas las entradas
Mostrando entradas con la etiqueta pygtk. Mostrar todas las entradas

miércoles, 9 de junio de 2010

Usando path relativos para los templates de Django

En el archivo settings.py, es necesario indicar donde se encuentran los templates con su path absoluto:
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

Teniendo en cuenta que es código python, podemos hacer que esos paths se calculen a partir de paths relativos. Veamos como.


Es necesario incluir el siguiente código en el fichero settings.py
import os
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))

Una vez añadido este código al fichero, ya podemos indicar el template de forma relativa.

TEMPLATE_DIRS = (
os.path.join(PROJECT_PATH, 'templates')

)

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()