Een app maken [Vala + Gtk 3] (2e deel)

In dit tweede deel zullen we de logica van de applicatie bouwen (om de code te zien en te analyseren is het beter om deze volledig te bekijken, wat ik onderaan het bericht zal plaatsen), maar daarvoor zullen we de moeten installeren sqlite3-bibliotheken die we zullen gebruiken om de vragen en hun respectievelijke antwoorden op te slaan:

sudo apt-get install libsqlite3-dev

Zodra de bibliotheken zijn geïnstalleerd, hebben we alleen nog een "gebruik van Sqlite;" nodig. om sqlite in vala te kunnen gebruiken.

We zullen een tabel moeten maken die het volgende bevat:

vraag
Antwoord 1
Antwoord 2
Antwoord 3
Antwoord 4
correct

bijvoorbeeld:

Pregunta      = es desdelinux un buen blog?

Antwoord1 = die blog bestaat niet
Antwoord2 = nee
Antwoord3 = ja
Antwoord4 = hallo

Zoals we allemaal weten is het juiste antwoord 2 (de goede is 3)

juist = 3

Om de tabel te maken en te beheren, hebben we SQL-instructies nodig (u kunt ernaar zoeken in uw favoriete zoekmachine), instructie om de tabel te maken:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Vragen invoegen...:

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

Oké, nu een vraag (willekeurig besteld):

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

De database openen:

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

Als we het nog niet hebben gemaakt (de eerste keer dat we de code uitvoeren), wordt het vanzelf gemaakt.

Leg vast van 2013-11-06 19:48:02

Maak de tabel en voeg vragen in:

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

Controleer of er geen fout is:

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

We zullen 6 strings maken die ons zullen helpen vragen en antwoorden toe te wijzen.

 privéreeks p; privéreeks r1; privéreeks r2; privéreeks r3; privéreeks r4; privéreeks c;

Een vraag plaatsen (die we krijgen van test.db) met een SELECT:

 private void bd_select_questions () {string query = "SELECTEER vraag, antwoord1, antwoord2, antwoord3, antwoord4, corrigeer UIT vragen BESTEL OP 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) {voor (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); }}}

Stel de vraag aan de grafische 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);
}

Tarief:

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

Probeer of het antwoord juist is:


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

Tijdlogica, zoals we in het vorige bericht hebben gezien, hoeven we alleen een toe te voegen als dat controleert of de tijd, als deze 1 bereikt, we het antwoord als onjuist beschouwen:

Leg vast van 2013-11-03 12:58:42

Compileren (we voegen –pkg sqlite3 toe)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Drie knoppen maken (50%, Freeze, Pass):

We maken een nieuwe horizontale Gbox en voegen er de drie knoppen aan toe, we voegen deze Gbox toe aan degene die we al hadden gemaakt:

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

Leg vast van 2013-11-06 20:48:46

Volledige code: http://paste.desdelinux.net/4882


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   fabian zei

    Hartelijk dank voor de tutorial, erg interessant voor degenen onder ons die met iets eenvoudigs willen beginnen. Ik heb meer hulp nodig bij het maken van de gegevenstabellen. groeten

  2.   genuanceerd zei

    Erg goed! Goed uitgelegd en gedetailleerd. Bedankt voor de gegevens. (En)

  3.   rho zei

    Bedankt man! Zeer interessant, net als de eerste.
    Het zou goed zijn om de verschillende complementaire voorbeelden te zien, zoals opmerkingen (die pop-ups) of menu's (zoals die in de panelen die verschijnen in elementair of kabouter-shell)...
    De waarheid is: heel goed.
    Wij lezen elkaar :=)