|
|
Este documento está disponible en los siguientes idiomas: English Castellano ChineseGB Deutsch Francais Nederlands Portugues Turkce |
por Hilaire Fernandes <hilaire(at)ofset.org> Sobre el autor: Hilaire Fernandes es vicepresidente de OFSET, una organización que promueve y desarrolla software libre educativo para el proyecto GNOME. El escribió el paquete Dr. Geo, un software para geometria dinámica. Actualmente está trabajando en Dr. Genius, un software matemático para propósitos educativos del proyecto GNOME. Contenidos: |
Resumen:
Esta serie de artículos está dirigida principalmente para los programadores que acaban de iniciarce en el área de Gnome y GNU/Linux. Python es el lenguaje de programación que he escogido, ya que es un lenguaje mucho más rápido de asimilar que lenguajes compilados como C. Para poder comprender este artículo necesitarás conocer las bases de programación en Python.
El software necesario para ejecutar el programa descrito fue mencionado en el primer arctículo de esta serie.
Necesitarás:
el archivo .glade, original [ drill.glade ] ;
el código fuente de drill, en Python [ drill.py ].
El procedimiento de instalación y el uso de Python-Gnome con LibGlade, fueron descritos en la primera parte de esta serie de arctículos.
La meta del primer artículo fue demostrar el mecanismo y los modos de interacción entre los diferentes componentes de un programa escrito para una configuración que utiliza Gnome, Glade, LibGlade y Python.
El ejemplo usaba el widget GnomeCanvas. Este ejemplo nos proporcionó una presentación colorida y nos mostró lo fácil que es desarrollar aplicaciones con esta configuración.
Para las siguientes secciones, sugiero utilizar un ambiente de trabajo (framework) en el cual podamos explicar los diferentes widgets de Gnome. Este artículo se concentra en la configuración de dicho ambiente de trabajo. Futuros artículos usarán este ambiente adicionando más características para ilustrar otros Gnome widgets.
Nuestro ambiente de trabajo (framework) es llamado Drill. Esta es una plataforma para propósitos educacionales, la cual será usada para nuestros ejemplos y ejercicios. Estos ejemplos son solamente con intenciones educativas para demostrar el uso de widgets.
Los widgets
La ventana de la aplicación es creada con Glade. Como en los artículos anteriores, primero crearás una ventana para una aplicación Gnome. Estando en esa ventana necesitarás borrar los íconos y menús inútiles
La parte principal de Drill deberá ser dividida en dos espacios de trabajo (workspaces) usando el GtkPaned widget.
Fig.
1 – Ventana principal de Drill
Ambos espacios de trabajo (workspaces) son separados verticalmente con un manejador usado para ajustar la medida de cada uno. El espacio de trabajo izquierdo contienen el tree widget (GtkTree), en el cual las diferentes partes del ejercicio deberán almacenadas por categoría.
El espacio de trabajo derecho está vacío, aquí es donde adicionaremos los ejercicios de acuerdo a los deseos del usuario.
Desde Glade, viendo la interfáz de Drill, nos muestra la estructura de sus componentes.
Fig.
2 – Vista del arbol de Drill
Puedes ver en la figura 2 que el widget hpanedTree (del tipo GtkPaned), solamente contieene un widget, frame2 (del tipo GtkFrame), el que está a la izquierda. frame2 cotiene el widget exerciceTree. Es preferible, primero insertar un widget GtkFrame con una sombra del tipo GTK_SHADOW_IN dentro de un GtkPaned widget. Esto evita enmascarar el manejo.
Por último , la caja de diálogo de Gnome “About Drill” puede parecer como está:
Fig.
3 – Caja de diálogo "About"
Drill
Los diversos items son editados con Glade en la hoja de Widget de la ventana de características
Los widgets y los nombre de las funciones de procesos
Use los siguientes nombres de los widgets para manipularlos bajo los nombres desde Python.
Ventana de la aplicación Gnome:
Puedes ver estos nombres de widgets en la Fig. 2.
Mostramos aquí rápidamente los nombres de las funciones de proceso. Si necesitas más información sobre estos puedes leer la parte I de esta serie de artículos.
Nombre del widget |
Señal (Signal) |
Proceso (Proccesing) |
---|---|---|
about |
clicked |
gtk_widget_destroy |
about |
close |
gtk_widget_destroy |
about |
destroy |
gtk_widget_destroy |
button1 (Icon New in the |
clicked |
on_new_activate |
new |
activate |
on_new_activate |
drillApp |
destroy |
on_exit_activate |
exit |
activate |
on_exit_activate |
about |
activate |
on_about_activate |
Ajustes finales
Desde Glade es posible especificar la geometría de los widgets. En nuestro caso, podrás ajustar la medida del drillApp a 400 y 300 desde el Common tab en el panel de propiedades ( properties). También podrás especificar la posición del divididor horizontal en 100 en vez de 1.
Ahora el widget exerciceTree necesita ser ajustado para solamente permitir una selección a la vez. De hecho, solamente un ejercicio puede ser seleccionado a la vez. Desde el panel de propiedades (properties) selecciona Selection->Single. Las otras opciones para este widget son menos importantes.
Voilà, esto es todo lo que haremos en lo que a Drill concierne. Iniciaremos desarrollando ejercicios en el siguiente artículo. Por ahora, veremos como usar la interface desde Python y como manipular el GtkTree widget.
El codigo fuente completo puede ser encontrado al final de este documento. Necesitarás guardarlo en el mismo directorio enel que se encuentra el archivo drill.glade.
from gtk import *
from gnome.ui
import *
from
GDK import *
from libglade import *
La creación de la interface gráfica y la conección de las funciones de procesamiento con LibGlade se termina de la misma forma que en ejemplo anterior. No queremos regresar a ese aspecto en aprticular.
En el programa de Python definiremos las siguientes variables globales:
currentExercice: Puntero al widget que representa el ejercicio actual. Este último es localizado a la derecha de la ventana de aplicación de Drill. Los ejercicios también deberán ser creados desde Glade.
exerciceTree : Puntero al widget tree sobre la parte izquierda de la ventana de aplicación Drill.
label : Puntero a una etiqueta (GtkLabel). Esta etiqueta es paliativoya que de hecho no tenemos ningún ejercicio asignado en este momento. La localizaremos en la parte derecha de nuestro árbol (tree widget), donde los ejercicios serán localizados, y mostraremos hay los identificadores de los ejercicios seleccionados.
El árbol es creado desde LibGlade, este puntero se obtiene via la siguiente llamada:
exerciceTree = wTree.get_widget ("exerciceTree")
Necesitaremos el puntero para los paneles horizontales, en este caso el contenedor de referencia (GtkPaned) de los dos paneles horizontales separados por un manejador (handle). El que está en la izquierda contiene el árbol; el de la derecha contiene los ejercicios; por ahora localizaremos la etiqueta allí:
paned =
wTree.get_widget
("hpanedTree") |
De nuevo, el uso de GTK+ Reference manual – sobre los objetos GtkLabel y GtkPaned – y el código fuente de Python /usr/lib/python1.5/site-packages/gtk.py te proporcionarán toda la información necesaria para el empleo correcto de los objetos .
El widget GtkTree
Esta es la parte más popular del artículo: cómo usar un árbol del tipo GtkTree?
El árbol es llenado con llamadas consecutivas a las funciones:
addMathExercices(), addFrenchExercices(), addHistoryExercices() y addGeographyExercices()
Estas funciones son muy similares entre sí. Cada una de estas adiciona una nueva subcategoría (un subarbol) como pueden ser los títulos de los ejercicios (items) :
def addMathExercices
(): |
El subarbol
def addSubtree
(name): |
Para crear un subarbol en un árbol existente necesitarás hacer dos cosas: Generar un árbol del tipo GtkTree y un item del tipo GtkTreeItem, con el nombre del subarbol. Después, el item es adicionado al árbol raíz (el árbol que contiene todas las categorías), y adicionaremos el subarbol al item usando el método set_subtree(). Finalmente el evento select es conectado al item, entonces, cuandp la categoría es seleccionada, la función selectSubtree() es llamada.
GtkTreeItem
def addExercice (category,
title,
idValue): |
Los items tienen los nombres de los ejercicios como su títutlo, aquí solo Excercice 1, Excercice 2... Para cada item asociaremos un ID atributo adicional. GTK+ tiene la posibilidad para adicionar algún objeto del tipo GtkObject (todos los widgets GTK+ vienen de ahy) los mismos atributos. Para hacer esto existen dos métodos, set_data (key, value) y get_data (key) para inicializar y obtener los valores de un atributo. El item entonces es adicionado a esta categoría (un subarbol). El método show() es llamado desde que es requerido para mostrarse. Por último, los métodos select y deselect son conectados. El evento deselect se llega a activar cuando el item pierde la selección. Cronológicamnete, el método deselectTreeItem() es llamado cuando el item está perdiendo su selección, continuando, el método selectTreeItem() es llamado cuando el item está tomando la selección.
Tenemos definidas tres funciones de procesado selectTreeItem(), deselectTreeItem() y selectSubtree(). Estas actualizan la etiqueta de texto (sobre el lado derecho) con el valor del atributo ID (id). Esto es todo por ahora...
Solo ajustaremos la infraestructura en la cual adicionaremos los ejercicios (como hemos descubierto nuevamente... los widgets) Hemos discutido el widget GtkTree y como asociamos atributos a los widgets. Este mecanismo es utilizado para obtener información adicional desde las funciones de procesamiento, que tenemos finalizadas aquí. Hasta el siguiente artículo; puedes tratar de transformar el juego Couler, que se utilizó en la parte I, como un ejercicio en Drill.
#!/usr/bin/python
# Drill - Teo
Serie
#Cuestiones de licencia...
#
Copyright Hilaire
Fernandes 2001
# Release under the terms of the GPL
licence
#
You can get a copy of the license at
http://www.gnu.org from gtk
import *
from gnome.ui import *
from GDK import
*
from
libglade import * exerciceTree = currentExercice =
label = None
def
on_about_activate(obj): |
def deselectTreeItem
(item): |
def selectSubtree
(subtree): |
def addExercice (category,
title, id): |
def addMathExercices
(): |
def addFrenchExercices
(): |
def addHistoryExercices
(): |
def addGeographyExercices
(): |
def initDrill (): paned = wTree.get_widget
("hpanedTree") #Liberar el árbol
GladeXML # Adicionar
ejercicios |
#Temporalmente hasta que
implementemos un
ejercicio real
initDrill () |
|
Contactar con el equipo de LinuFocus
© Hilaire Fernandes, FDL LinuxFocus.org Pinchar aquí para informar de algún problema o enviar comentarios a LinuxFocus |
Información sobre la traducción:
|
2002-02-08, generated by lfparser version 2.21