إنشاء تطبيق [Vala + Gtk 3] (الجزء الثاني)

في هذا الجزء الثاني ، سنبني منطق التطبيق (لرؤية الكود وتحليله بشكل أفضل للنظر إليه بالكامل سأضعه أسفل المنشور) ، ولكن قبل ذلك سنحتاج إلى تثبيت مكتبات sqlite3 التي سنقوم بها استخدمها لتتمكن من حفظ الأسئلة والإجابات الخاصة بها:

sudo apt-get install libsqlite3-dev

بمجرد تثبيت المكتبات ، سنحتاج فقط إلى "using Sqlite؛" لتتمكن من استخدام sqlite في vala.

سنحتاج إلى إنشاء جدول يحتوي على:

استجواب
الجواب 1
الجواب 2
الجواب 3
الجواب 4
صيح

على سبيل المثال:

سؤال = هو desdelinux مدونة جيدة؟

Answer1 = هذه المدونة غير موجودة
Answer2 = لا
Answer3 = نعم
Answer4 = مرحبًا

كما سنعرف جميعًا أن الإجابة الصحيحة هي 2 (الصالح هو 3)

صحيح = 3

لإنشاء الجدول والتعامل معه ، سنحتاج إلى معرفة sql (يمكنك البحث عنها في محرك البحث المفضل لديك) ، بيان لإنشاء الجدول:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
أدخل الأسئلة ...:

أدخل في الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيحة) القيم ('es) desdelinux مدونة جيدة"، "إنها ليست مدونة"، "لا"، "نعم"، "مرحبًا"، 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; // فتح قاعدة البيانات / إنشاء قاعدة بيانات int ec = Sqlite.Database.open("test.db", out db); if (ec != Sqlite.OK) { stderr.printf ("لا يمكن فتح قاعدة البيانات: %d: %s\n"، db.errcode ()، db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { استعلام السلسلة = """ إنشاء أسئلة الجدول ( نص السؤال، نص الإجابة 1، نص الإجابة 2، نص الإجابة 3، نص الإجابة 4، صحيح INT )؛ إدراج INTO الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيحة) القيم ('is desdelinux مدونة جيدة"، "إنها ليست مدونة"، "لا"، "نعم"، "مرحبًا"، 3)؛ أدخل في الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيح) القيم ('5+5'، '25'، '10'، '3'، '5'، 2)؛ """; ec = db.exec (استعلام، فارغ، خارج errmsg)؛ if (ec != Sqlite.OK) { stderr.printf ("خطأ: %s\n"، errmsg)؛ } } }

تأكد من عدم وجود خطأ:

 if (ec! = Sqlite.OK) {stderr.printf ("خطأ:٪ s \ n"، errmsg)؛ عودة -1 ؛ }

سننشئ 6 سلاسل ستساعدنا في تخصيص الأسئلة والأجوبة.

 سلسلة خاصة p ؛ سلسلة خاصة r1 ؛ سلسلة خاصة r2 ؛ سلسلة خاصة r3 ؛ سلسلة خاصة r4 ؛ سلسلة خاصة ج ؛

وضع سؤال (نحصل عليه من test.db) باستخدام SELECT:

 private void bd_select_questions () {string query = "SELECT question، answer1، answer2، answer3، answer4، right FROM questions ORDER BY RANDOM ()"؛ int rc = db.prepare_v2 (استعلام ، -1 ، خارج stmt ، فارغ) ؛ int cols = stmt.column_count () ، rc = stmt.step () ؛ int كول؛ إذا (rc == Sqlite.ROW) {لـ (col = 0؛ col <cols؛ col ++) {string txt = stmt.column_text (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؛ } آخر {c = txt؛ } // print ("٪ 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");
});

منطق الوقت ، كما رأينا في المنشور السابق ، علينا فقط إضافة إذا كان هذا يتحقق من أن الوقت إذا وصل إلى 1 ، نعطي الإجابة على أنها غير صحيحة:

لقطة من 2013/11/03 12:58:42

تجميع (نضيف –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

إنشاء ثلاثة أزرار (50٪ ، تجميد ، تمرير):

نقوم بإنشاء 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.   فابيان قال

    شكرًا جزيلاً على البرنامج التعليمي ، فهو ممتع جدًا لأولئك منا الذين يريدون البدء بشيء بسيط ، سأحتاج إلى مزيد من المساعدة في الجزء المتعلق بإنشاء جداول البيانات. في صحتك

  2.   الدقة في درجات االإختلاف قال

    جيد جدا! شرح جيد ومفصل. شكرا على البيانات. (و)

  3.   رو قال

    شكرا يا رجل! مثيرة جدا للاهتمام كالأول.
    سيكون من الجيد رؤية الأمثلة التكميلية المختلفة ، اكتب التعليقات (تلك النوافذ المنبثقة من النوع) أو القوائم (اكتب تلك اللوحات التي تظهر في أولية أو جنوم شل) ...
    الحقيقة جيدة جدا
    نقرأ: =)