Creando una app [Vala + Gtk 3] (2da parte)

En esta segunda parte construiremos la lógica de la aplicación (para ver y analizar el código mejor mirarlo completo que lo pondré abajo del post), pero antes de eso necesitaremos instalar las librerías sqlite3 que usaremos para poder guardar las preguntas y sus respectivas respuestas:

sudo apt-get install libsqlite3-dev

Una ves instaladas las librerías solo necesitaremos un «using Sqlite;» para poder usar sqlite en vala.

Necesitaremos crear una Tabla que contenga:

Pregunta
Respuesta1
Respuesta2
Respuesta3
Respuesta4
correcta

ejemplo:

Pregunta      = es desdelinux un buen blog?

Respuesta1  = no existe ese blog
Respuesta2  = no
Respuesta3  = si
Respuesta4  = hola

como todos sabremos la respuesta correcta es la 2 (na la buena es la 3)

correcta       = 3

Para crear la tabla y manejarla necesitaremos saber sentencias sql (podéis buscarlo en vuestro buscador favorito), sentencia para crear la tabla:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Insertar preguntas … :

INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);

Bien ahora obtener una pregunta (ordenadas de forma random) :

SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()

Abriendo la base de datos:

int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}

En caso que no la tengamos ya creada (primera vez que ejecutamos el código) se creara sola.

Captura de 2013-11-06 19:48:02

Crear la tabla y inserir preguntas:

 private void bd () {
string errmsg;
// Abre la base de datos / Crea la base de datos
int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}
if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) {
string query = """
CREATE TABLE preguntas (
pregunta TEXT,
respuesta1 TEXT,
respuesta2 TEXT,
respuesta3 TEXT,
respuesta4 TEXT,
correcto INT
);

INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);
INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('5+5', '25', '10', '3', '5', 2);
""";

ec = db.exec (query, null, out errmsg);
if (ec != Sqlite.OK) {
stderr.printf ("Error: %s\n", errmsg);
}
}
}

Comprobar que no hay error:

 if (ec != Sqlite.OK) {
stderr.printf ("Error: %s\n", errmsg);
return -1;
}

Crearemos 6 string que nos ayudaran a hacer la asignación de preguntas y respuestas.

 private string p;
private string r1;
private string r2;
private string r3;
private string r4;
private string c;

Colocando una pregunta (que obtenemos de test.db) con un SELECT:

 private void bd_select_preguntas () {
string query = "SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()";
int rc = db.prepare_v2 (query, -1, out stmt, null );
int cols = stmt.column_count();
rc = stmt.step ();
int col;
if ( rc == Sqlite.ROW ) {
for (col = 0; col < cols; col++) {
string txt = stmt.column_text(col);
if(col == 0){
p = txt;
}
else if(col == 1){
r1 = txt;
}
else if(col == 2){
r2 = txt;
}
else if(col == 3){
r3 = txt;
}
else if(col == 4){
r4 = txt;
}
else{
c = txt;
}
//print ("%s = %s\n", stmt.column_name (col), txt);
}
}
}

Colocar la pregunta a los elementos graficos:

private void next_pregunta () {
this.pregunta.set_label(this.p);
this.resposta1.set_label(this.r1);
this.resposta2.set_label(this.r2);
this.resposta3.set_label(this.r3);
this.resposta4.set_label(this.r4);
}

Puntuar:

private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}

Tratar si es correcta la respuesta:


private void correcto (string cor) {
if (this.c == cor) {
this.puntua ();
this.bd_select_preguntas ();
this.next_pregunta();
}
else{
//incorrecto
}
}

resposta1.clicked.connect (() => {
this.correcto("1");
});
resposta2.clicked.connect (() => {
this.correcto("2");
});
resposta3.clicked.connect (() => {
this.correcto("3");
});
resposta4.clicked.connect (() => {
this.correcto("4");
});

Lógica del tiempo, como ya vimos en el anterior post solo tenemos de añadir un if que compruebe que el tiempo si este llega a 1 damos como incorrecta la respuesta :

Captura de 2013-11-03 12:58:42

Compilar (le añadimos –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Creando tres botones (50%, Congelar, Pasar):

Creamos un nuevo Gbox horizontal y le añadimos los tres botones, añadimos este Gbox al que ya teníamos creado:

this.box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
var button1 = new Gtk.Button.with_label ("50%");
var button2 = new Gtk.Button.with_label ("congelar");
var button3 = new Gtk.Button.with_label ("passar");
this.box2.pack_start(button1);
this.box2.pack_start(button2);
this.box2.pack_start(button3);

this.box.pack_start (box2);

Captura de 2013-11-06 20:48:46

Código completo: http://paste.desdelinux.net/4882


3 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   fabian dijo

    Muchas gracias por el tutorial, muy interesante para los que queremos empezar con algo sencillo, necesitaría mas ayuda con la parte de creación de las tablas de datos. saludos

  2.   matizak dijo

    Muy bueno! Bien explicado y detallado. Gracias por la data. (y)

  3.   rho dijo

    Gracias man! Interesantísimo como el primero.
    Estaría bueno ver las diversas instancias complementarias, tipo comentarios (esos tipo pop ups) o menues (tipo los de los paneles que salen en elementary o gnome-shell)…
    La verdad, muy bueno.
    Nos leemos :=)