Implementando preguntas in_line_choice

La creación de la interfaz ha sido una mezcla entre preguntas de tipo choice, ya que se tiene que dar espacio en el formulario para introducir las posibles respuestas, y de tipo entry_text, ya que hay que introducir un símbolo para decir en que lugar se quiere introducir el combobox (conjunto de respuestas posibles en el punto de la pregunta señalado). La parte de más elaboración es como siempre la creación de la pregunta en forma XML. Se han de mapear las respuetas dadas como nodos mapEntry con sus respectivos valores. Cada opción será un nodo inlinechoice, que llevará un identificador, dentro de los nodos inlinechoiceInteraction que es el nodo representativo de este tipo de preguntas.

Obtenido: Implementación y creación de una interfaz para las pregutnas de tipo in_line_choice

Objetivo: Creación de las tablas de la base de datos para almacenar preguntas.

Anuncios

PyGtk: Menus emergentes con click derecho del ratón

Querer dar facilidad al usuario, muchas veces se convierte en dar calenturas de cabeza al programador. Hoy he pasado bastante tiempo hasta que he conseguido poder realizar algo tan aparentemente sencillo como un menú emergente con un click derecho de ratón.

Para comenzar, he estado buscando como capturar el evento derecho del ratón, en mi caso dentro de un gtk.TreeView (widget al que hay que dedicarle tiempo aparte…) . Al caso, es que me he vuelto loco, no encontraba la señal “right-clicked” por decirlo de algún modo. Cuando he conseguido encontrar algo, ha sido una máscara gtk.gdk.BUTTON2_MASK, no tenía que hacer con ella. Dando vueltas he encontrado la señal “button-press-event”, que se emite cuando se pulsa cualquier botón del ratón. Así, que he añadido el evento y conectado la señal, mediante:

self.treeview.add_events(gtk.gdk.BUTTON2_MASK)
self.treeview.connect("button-press-event", self.rightClick)

Por otro lado, si se quiere crear un menú y añadirle elementos (en este caso con una imagen), se debe añadir un gtk.ImageMenuItem y conectarle la señal quedando algo así:


self.menu = gtk.Menu()
menu_items = gtk.ImageMenuItem(gtk.STOCK_ADD)
self.menu.append(menu_items)
menu_items.connect("activate", self.menuitem_response)
menu_items.show()

Obtenido: Inmersión en los widget TreeView y Menu y en los eventos de ratón.

Objetivo: Utilización de los mismo en la interfaz de creación de exámenes.

Pygtk: Drag’n drops

Una aplicación con la capacidad de arrastrar-y-soltar primero define y configura el/los control/es para arrastrar-y-soltar. Cada control puede ser una fuente y/o destino para arrastrar-y-soltar. Debe tenerse en cuenta que estos controles han de tener una ventana X asociada.

Los controles fuente pueden enviar datos de arrastrar, permitiendo así al usuario arrastrar cosas desde ellos, mientras que los controles destino pueden recibir datos de arrastrar. Los destinos de arrastrar-y-soltar pueden limitar quiénes pueden enviarles datos, por ejemplo, la propia aplicación o cualquier aplicación (incluyéndose a sí misma).

Para enviar y recibir datos se utilizan señales. Soltar un elemento en un control destino requiere una petición de datos (para el control fuente) y un manejador de datos recibidos (para el control destino). Se pueden conectar manejadores de señal adicionales si se quiere saber cuándo empieza el usuario a arrastrar (en el mismo momento en el que empieza), cuándo se realiza el soltar, y cuándo finaliza el proceso completo de arrastrar-y-soltar (con éxito o no).

La aplicación debe proporcionar los datos a los controles origen cuando se le sean solicitados, lo cual implica tener un manejador de señal para la solicitud de datos. Los controles destino han de tener un manejador de señales de datos recibidos.

Por tanto, un ciclo habitual de arrastrar-y-soltar sería así:

  • Se empieza a arrastrar. El control fuente puede recibir la señal “drag-begin”. Puede configurar el icono de arrastrar, etc.
  • Se mueve lo arrastrado sobre el área de soltar. El control destino puede recibir la señal “drag-motion”.
  • Se suelta el botón. El control destino puede recibir la señal “drag-drop”. El control destino debería solicitar los datos fuente.
  • Se solicitan los datos de arrastrar (al soltar el botón). El control fuente puede recibir la señal “drag-data-get”.
  • Se reciben los datos (puede ser en la misma o en otra aplicación). El control destino puede recibir la señal “drag-data-received”.
  • Se borran los datos de arrastrar (si el arrastre fue un movimiento). El control fuente puede recibir la señal “drag-data-delete”.
  • El proceso arrastrar-y-soltar termina. El control fuente puede recibir la señal “drag-end”.

Obtenido: Aprendizaje del funcionamiento de los drag’n drops en pygtk, así como la creación de un par de ejemplos.

Objetivo: Utilización de los mismos en la interfaz de creación de exámenes.

Implementando preguntas entry text

Hoy ha sido el turno de las preguntas de la clase entry text. Me queda crear la pregunta en formato XML, que terminaré mañana. La interfaz ya está creada y los métodos que recogen los datos y los comprueban también. Además, voy aprendiendo poco a poco algunas cosillas nuevas de Glade y pygtk que comentaré dentro de unos días.

Obtenido: Implementación y creación de la interfaz para preguntas tipo entry text

Objetivo: Diseñar una interfaz para la creación de examenes, basándose en un banco de preguntas.

Implementando preguntas de tipo Choice

Hoy he dejado los tests a un lado, ya que he decidido implementar primero aquellos tipos de preguntas que según la encuesta más útiles son para los profesores, estas son: extended_text, choice, choice_multiple y text_entry, en realidad las tres primeras son las que claramente más útiles han manifiestado los profesores que lo son. Así que me he metido con Glade, a diseña la interfaz para crear las preguntas de tipo elección con una o varias respuestas, he cambiado algunas cosas de la interfaz que cree de prueba, para adaptarla con el interés de cumplir la especificación IMS QTI v2.0.

Luego ya en Python, ha tocado programar los eventos, realmente sólo tres (tres “clicks” de botones) para ampliar el formulario para disponer de espacio para especificar más respuestas posibles, hay tres espacios por defecto, para crear la pregunta y para cancelar. Para terminar de pasar los tests, he tenido que crear una función para comprobar que el formulario se ha rellenado de forma correcta y otra para crear el fichero XML de la pregunta.

Obtenido: Implementación y creación de la interfaz para la preguntas de tipo choice.

Objetivo: Continuar con la creación de interfaces e implementación para las preguntas

Testing: in_line_choice

De este tipo de preguntas ya comenté algo en el anterior post, son aquellas que se visualizan como preguntas en las que se da un texto y en diversos puntos de este texto se ha de elegir una respuesta de una serie de opciones que se le da al alumno. Una forma de representación de este tipo de preguntas es mostrar el texto y en aquellos puntos donde se debe elegir una respuesta, presentar un combobox cuyos elementos son las distintas opciones de las que dispone el alumno para elegir.

A efectos de test, la función de comprobación de que la pregunta se creo de forma correcta es igual que la función de comprobación de una interacción text_entry, a excepción que no se debe indicar una longitud máxima para la respuesta (ya que ya viene presentada por el profesor). En cuanto a la creación del documento XML, se ha indicar la respuesta correcta y mapear cada una de las respuestas con un valor, esto se realiza mediante los nodos mapEntry, las opciones que se van a mostrar se indican mediante nodos inlinechoice a las que se les asigna un identificador que es usado en el mapeo de respuesta – calificación (el nodo mapEntry que comentaba), dentro de los nodos inlinechoiceInteraction que es el nodo representativo de este tipo de preguntas.

Obtenido: Test ha cumplir por las preguntas in_line_choice

Objetivo: Comenzar a implementar las preguntas básicas que satisfacen los tests creados durante estos días.