Skapa en app [Vala + Gtk 3] (andra delen)

I denna andra del kommer vi att bygga applikationens logik (för att se och analysera koden bättre för att se på den fullständigt så att jag kommer att lägga den under inlägget), men innan det kommer vi att behöva installera sqlite3-biblioteken som vi kommer att kan användas för att kunna spara frågorna och deras respektive svar:

sudo apt-get install libsqlite3-dev

När biblioteken är installerade behöver vi bara en "med Sqlite;" för att kunna använda sqlite i vala.

Vi måste skapa en tabell som innehåller:

Fråga
Svar 1
Svar 2
Svar 3
Svar 4
korrekt

exempel:

Fråga = är desdelinux en bra blogg?

Answer1 = den bloggen finns inte
Answer2 = nej
Answer3 = ja
Answer4 = hej

eftersom vi alla vet är rätt svar 2 (den goda är 3)

rätt = 3

För att skapa bordet och hantera det måste vi veta SQL (du kan söka efter den i din favoritsökmotor), uttalande för att skapa tabellen:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Infoga frågor ...:

INFOGA I frågor (fråga, svar1, svar2, svar3, svar4, rätt) VÄRDEN ('es desdelinux en bra blogg', 'det är inte en blogg', 'nej', 'ja', 'hej', 3);

Ok, nu får du en fråga (sorterad slumpmässigt):

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

Öppna databasen:

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

Om vi ​​inte redan har skapat den (första gången vi kör koden) skapar den sig själv.

Fånga från 2013-11-06 19:48:02

Skapa tabellen och infoga frågor:

 privat void bd() { sträng errmsg; // Öppna databas / Skapa databas int ec = Sqlite.Database.open("test.db", ut db); if (ec != Sqlite.OK) { stderr.printf ("Kan inte öppna databasen: %d: %s\n", db.errcode (), db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { string query = """ SKAPA TABELL frågor ( fråga TEXT, svar1 TEXT, svar2 TEXT, svar3 TEXT, svar4 TEXT, rätt INT ); INFOGA INTO frågor (fråga, svar1, svar2, svar3, svar4, rätt) VÄRDEN ('är desdelinux en bra blogg', 'det är inte en blogg', 'nej', 'ja', 'hej', 3); INSERT INTO frågor (fråga, svar1, svar2, svar3, svar4, rätt) VÄRDEN ('5+5', '25', '10', '3', '5', 2); """; ec = db.exec (fråga, null, ut errmsg); if (ec != Sqlite.OK) { stderr.printf ("Fel: %s\n", errmsg); } } }

Kontrollera att det inte finns något fel:

 om (ec! = Sqlite.OK) {stderr.printf ("Fel:% s \ n", errmsg); retur -1; }

Vi kommer att skapa 6 strängar som hjälper oss att göra frågor och svar.

 privat sträng p; privat sträng r1; privat sträng r2; privat sträng r3; privat sträng r4; privat sträng c;

Att ställa en fråga (som vi får från test.db) med en SELECT:

 privat ogiltigt bd_select_questions () {string query = "VÄLJ fråga, svara1, svara2, svara3, svara4, korrigera FRÅN FRÅGOR FÖR RANDOM ()"; int rc = db.prepare_v2 (fråga, -1, ut stmt, null); int cols = stmt.column_count (); rc = stmt.step (); int kol; om (rc == Sqlite.ROW) {för (col = 0; col <cols; col ++) {string txt = stmt.column_text (col); om (kol == 0) {p = txt; } annat om (kol == 1) {r1 = txt; } annat om (kol == 2) {r2 = txt; } annat om (kol == 3) {r3 = txt; } annat om (kol == 4) {r4 = txt; } annat {c = txt; } // print ("% s =% s \ n", stmt.column_name (col), txt); }}}

Ställ frågan till de grafiska elementen:

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);
}

Betygsätta:

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

Försök om svaret är korrekt:


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");
});

Tidslogik, som vi såg i föregående inlägg, behöver vi bara lägga till ett om det verifierar att tiden om den når 1 ger vi svaret som felaktigt:

Fånga från 2013-11-03 12:58:42

Kompilera (vi lägger till –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Skapa tre knappar (50%, Freeze, Pass):

Vi skapar en ny horisontell Gbox och lägger till de tre knapparna, vi lägger till den här Gbox till den vi redan hade skapat:

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

Fånga från 2013-11-06 20:48:46

Komplett kod: http://paste.desdelinux.net/4882


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   fabian sade

    Tack så mycket för handledningen, väldigt intressant för oss som vill börja med något enkelt, jag skulle behöva mer hjälp med att skapa datatabellerna. Skål

  2.   nyanserad sade

    Mycket bra! Väl förklarad och detaljerad. Tack för uppgifterna. (och)

  3.   rho sade

    Tack mannen! Mycket intressant som första.
    Det skulle vara bra att se de olika kompletterande instanser, typkommentarer (de här pop-up-fönstren) eller menyerna (skriv in de paneler som visas i elementära eller gnome-skal) ...
    Sanningen är mycket bra.
    Vi läser: =)