Izrada aplikacije [Vala + Gtk 3] (2. dio)

U ovom drugom dijelu ćemo izgraditi logiku aplikacije (da bismo bolje vidjeli i analizirali kôd da bismo ga pogledali u cijelosti, stavit ću ga ispod posta), ali prije toga trebat ćemo instalirati sqlite3 biblioteke koje ćemo koristite da biste mogli spremiti pitanja i njihove odgovore:

sudo apt-get install libsqlite3-dev

Jednom kada se biblioteke instaliraju, trebat će nam samo "koristeći Sqlite;" da biste mogli koristiti sqlite u vali.

Trebat ćemo stvoriti tablicu koja sadrži:

Pitanje
Odgovor 1
Odgovor 2
Odgovor 3
Odgovor 4
tačno

primer:

Pregunta      = es desdelinux un buen blog?

Odgovor1 = taj blog ne postoji
Odgovor2 = ne
Odgovor3 = da
Odgovor4 = zdravo

kao što ćemo svi znati tačan odgovor je 2 (dobra je 3)

tačno = 3

Da bismo kreirali tablicu i obradili je, trebamo znati sql (možete ga potražiti u vašoj omiljenoj tražilici), izraz za kreiranje tablice:

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

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

Ok, sad dobijte pitanje (nasumično poredano):

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

Otvaranje baze podataka:

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

U slučaju da ga već nismo kreirali (prvi put kad pokrenemo kod), kreiraće se sam.

Snimka iz 2013-11-06 19:48:02

Kreirajte tablicu i umetnite pitanja:

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

Provjerite da nema greške:

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

Stvorit ćemo 6 nizova koji će nam pomoći da dodijelimo pitanja i odgovore.

 privatni niz p; privatni niz r1; privatni niz r2; privatni niz r3; privatni niz r4; privatni niz c;

Postavljanje pitanja (koje dobivamo iz test.db) pomoću SELECT:

 private void bd_select_questions () {string query = "ODABERITE pitanje, odgovor1, odgovor2, odgovor3, odgovor4, ispravite IZ pitanja NARUČITE SLUČAJNO ()"; int rc = db.prepare_v2 (upit, -1, van stmt, null); int kols = 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; } inače ako (col == 1) {r1 = txt; } inače if (col == 2) {r2 = txt; } inače if (col == 3) {r3 = txt; } inače ako (col == 4) {r4 = txt; } else {c = txt; } // ispis ("% s =% s \ n", stmt.column_name (col), txt); }}}

Postavite pitanje grafičkim elementima:

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

Ocijeni:

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

Pokušajte ako je odgovor tačan:


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

Logika vremena, kao što smo vidjeli u prethodnom postu, moramo dodati samo if koji potvrđuje da vrijeme ako dosegne 1 dajemo odgovor kao netačan:

Snimka iz 2013-11-03 12:58:42

Sastavi (dodamo –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Izrada tri tipke (50%, Freeze, Pass):

Kreiramo novi horizontalni Gbox i na njega dodamo tri dugmeta, dodajemo ovaj Gbox onom koji smo već kreirali:

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

Snimka iz 2013-11-06 20:48:46

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


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   fabian rekao je

    Puno vam hvala na vodiču, vrlo zanimljivo za nas koji želimo započeti s nečim jednostavnim, trebala bih više pomoći oko dijela izrade tablica podataka. Živjeli

  2.   nijansiran rekao je

    Veoma dobro! Dobro objašnjeno i detaljno. Hvala na podacima. (i)

  3.   rho rekao je

    Hvala čovječe! Vrlo zanimljivo kao prvo.
    Bilo bi dobro vidjeti razne komplementarne instance, komentare tipa (ti tip iskačući prozori) ili menije (upišite one panele koji se pojavljuju u osnovnoj ili gnome-ljusci) ...
    Istina je vrlo dobra.
    Čitamo: =)