Створення програми [Vala + Gtk 3] (2-а частина)

У цій другій частині ми побудуємо логіку програми (щоб краще побачити та проаналізувати код, щоб поглянути на нього повністю, і я розміщу його під постом), але перед цим нам потрібно буде встановити бібліотеки sqlite3, які ми будемо використовувати для збереження запитань та відповідей на них:

sudo apt-get install libsqlite3-dev

Після встановлення бібліотек нам знадобиться лише "використання Sqlite;" щоб мати можливість використовувати sqlite у vala.

Нам потрібно буде створити таблицю, яка містить:

Питання
Відповідь 1
Відповідь 2
Відповідь 3
Відповідь 4
правильно

приклад:

Pregunta      = es desdelinux un buen blog?

Відповідь1 = що блогу не існує
Відповідь2 = ні
Відповідь3 = так
Відповідь4 = привіт

як ми всі знатимемо правильну відповідь 2 (хороший - 3)

правильно = 3

Щоб створити таблицю та обробити її, нам потрібно знати sql (ви можете шукати його в улюбленій пошуковій системі), оператор для створення таблиці:

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

Гаразд, отримайте запитання (відсортоване випадково):

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

Відкриття бази даних:

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

Якщо у нас його вже не створено (перший раз, коли ми запускаємо код), він створить сам.

Захоплення з 2013-11-06 19:48:02

Створіть таблицю та вставте запитання:

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

Переконайтесь, що помилки немає:

 if (ec! = Sqlite.OK) {stderr.printf ("Помилка:% s \ n", errmsg); повернення -1; }

Ми створимо 6 рядків, які допоможуть нам призначити запитання та відповіді.

 приватний рядок p; приватний рядок r1; приватний рядок r2; приватний рядок r3; приватний рядок r4; приватний рядок c;

Розміщення запитання (яке ми отримуємо з test.db) за допомогою SELECT:

 private void bd_select_questions () {string query = "ВИБІР запитання, відповіді1, відповіді2, відповіді3, відповіді4, виправлення ІЗ запитань ЗАМОВИТИ НА СЛУЧАЙНИЙ ()"; int rc = db.prepare_v2 (запит, -1, вихід stmt, нуль); int cols = stmt.column_count (); rc = stmt.step (); int col; if (rc == Sqlite.ROW) {for (col = 0; col <cols; col ++) {рядок txt = stmt.column_text (col); якщо (col == 0) {p = txt; } інакше якщо (col == 1) {r1 = txt; } інакше якщо (col == 2) {r2 = txt; } інакше якщо (col == 3) {r3 = txt; } інакше якщо (col == 4) {r4 = txt; } ще {c = txt; } // друк ("% s =% s \ n", stmt.column_name (col), txt); }}}

Поставте питання до графічних елементів:

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

Оцініть:

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

Спробуйте, якщо відповідь правильна:


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

Логіка часу, як ми бачили в попередньому дописі, нам потрібно лише додати if, який підтверджує, що час, якщо він досягне 1, ми даємо відповідь як неправильну:

Захоплення з 2013-11-03 12:58:42

Компілювати (ми додаємо –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Створення трьох кнопок (50%, Freeze, Pass):

Ми створюємо новий горизонтальний Gbox і додаємо до нього три кнопки, додаємо цей Gbox до вже створеного нами:

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

Захоплення з 2013-11-06 20:48:46

Повний код: http://paste.desdelinux.net/4882


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Fabian - сказав він

    Щиро дякую за підручник, дуже цікавий для нас, хто хоче розпочати з чогось простого, мені знадобиться додаткова допомога у частині створення таблиць даних. Ура

  2.   нюансований - сказав він

    Дуже добре! Добре пояснені та детально. Дякуємо за дані. (і)

  3.   ро - сказав він

    Дякую людино! Дуже цікавий як перший.
    Було б непогано побачити різні додаткові екземпляри, коментарі до типу (ті спливаючі вікна) або меню (наберіть ті панелі, які відображаються в елементарній або оболонці gnome) ...
    Правда дуже добра.
    Ми читаємо: =)