Tworzenie aplikacji [Vala + Gtk 3] (druga część)

W tej drugiej części zbudujemy logikę aplikacji (aby zobaczyć i przeanalizować kod lepiej przyjrzeć się mu w całości, że umieszczę go pod postem), ale wcześniej będziemy musieli zainstalować biblioteki sqlite3, których użyjemy, aby móc zapisać pytania i ich odpowiednie odpowiedzi:

sudo apt-get install libsqlite3-dev

Po zainstalowaniu bibliotek będziemy potrzebować tylko "using Sqlite;" aby móc korzystać z sqlite w vala.

Będziemy musieli stworzyć tabelę zawierającą:

pytanie
odpowiedź 1
odpowiedź 2
odpowiedź 3
odpowiedź 4
poprawny

przykład:

Pytanie = jest desdelinux dobry blog?

Answer1 = ten blog nie istnieje
Odpowiedź2 = nie
Answer3 = tak
Answer4 = witaj

jak wszyscy wiemy, prawidłowa odpowiedź to 2 (dobry to 3)

poprawnie = 3

Aby utworzyć tabelę i obsłużyć ją, będziemy musieli znać sql (możesz go wyszukać w swojej ulubionej wyszukiwarce), instrukcja do utworzenia tabeli:

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

WSTAW DO pytań (pytanie, odpowiedź 1, odpowiedź 2, odpowiedź 3, odpowiedź 4, poprawna) WARTOŚCI ('es desdelinux dobry blog”, „to nie jest blog”, „nie”, „tak”, „cześć”, 3);

Ok, teraz otrzymam pytanie (posortowane losowo):

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

Otwieranie bazy danych:

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

Jeśli nie mamy go już utworzonego (przy pierwszym uruchomieniu kodu), utworzy się sam.

Przechwytywanie z 2013 11:06:19

Utwórz tabelę i wstaw pytania:

 private void bd() { string errmsg; // Otwórz bazę danych / Utwórz bazę danych int ec = Sqlite.Database.open("test.db", out db); if (ec != Sqlite.OK) { stderr.printf („Nie można otworzyć bazy danych: %d: %s\n”, db.errcode (), db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { string query = """ UTWÓRZ TABELI pytania ( TEKST pytania, TEKST odpowiedzi 1, TEKST odpowiedzi 2, TEKST odpowiedzi 3, TEKST odpowiedzi 4, popraw INT ); WSTAW W pytania (pytanie, odpowiedź1, odpowiedź2, odpowiedź3, odpowiedź4, poprawna) WARTOŚCI ('jest desdelinux dobry blog”, „to nie jest blog”, „nie”, „tak”, „cześć”, 3); WSTAWIĆ DO pytań (pytanie, odpowiedź 1, odpowiedź 2, odpowiedź 3, odpowiedź 4, poprawna) WARTOŚCI („5+5”, „25”, „10”, „3”, „5”, 2); """; ec = db.exec (zapytanie, null, out errmsg); if (ec != Sqlite.OK) { stderr.printf („Błąd: %s\n”, errmsg); } } }

Sprawdź, czy nie ma błędu:

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

Stworzymy 6 ciągów, które pomogą nam przypisać pytania i odpowiedzi.

 prywatny ciąg p; prywatny ciąg r1; prywatny ciąg r2; prywatny ciąg r3; prywatny ciąg r4; prywatny ciąg c;

Zadanie pytania (które otrzymujemy z test.db) za pomocą SELECT:

 private void bd_select_questions () {string query = "SELECT question, answer1, answer2, answer3, answer4, correct FROM questions ORDER BY RANDOM ()"; int rc = db.prepare_v2 (zapytanie, -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.nazwa_kolumny (kolumna), txt); }}}

Zadaj pytanie elementom graficznym:

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

Oceniać:

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

Spróbuj, jeśli odpowiedź jest prawidłowa:


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 czasu, jak widzieliśmy w poprzednim poście, musimy tylko dodać, jeśli to weryfikuje, że czas, jeśli osiągnie 1, podajemy odpowiedź jako niepoprawną:

Przechwytywanie z 2013 11:03:12

Kompiluj (dodajemy –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Tworzenie trzech przycisków (50%, Freeze, Pass):

Tworzymy nowy poziomy Gbox i dodajemy do niego trzy przyciski, dodajemy ten Gbox do już utworzonego:

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

Przechwytywanie z 2013 11:06:20

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


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Fabian powiedział

    Bardzo dziękuję za tutorial, bardzo interesujący dla tych z nas, którzy chcą zacząć od czegoś prostego, potrzebowałbym więcej pomocy przy tworzeniu tabel danych. Twoje zdrowie

  2.   dopracowany powiedział

    Bardzo dobre! Dobrze wyjaśnione i szczegółowe. Dzięki za dane. (i)

  3.   rho powiedział

    Dzięki! Bardzo ciekawa jako pierwsza.
    Dobrze byłoby zobaczyć różne uzupełniające się instancje, wpisać komentarze (te wyskakujące okienka) lub menu (wpisać te z paneli, które pojawiają się w elementarnym lub gnome-shell) ...
    Prawda jest bardzo dobra.
    Czytamy: =)