Programos kūrimas („Vala + GTK 3“) [3 dalis]

Šioje dalyje pamatysime, kaip sukurti kitą langą ir suprojektuoti jį naudojant GTK. Taip pat pamatysime keletą funkcijų, pavyzdžiui, klausimų pridėjimą ir trijų mygtukų naudojimą (50%, užšaldymas ir perdavimas).

Įrankių juosta ir įrankių mygtukas

Sukurkite įrankių juostą:

app2

Sukūrę įrankių mygtuką, šiuo atveju įdėsime piktogramą (pagal nutylėjimą galite rasti daug piktogramų čia) su «from_stock (Gtk.Stock.IconName):

Fiksuoti nuo 2013-12-07 23:26:52

Matome, kad savo programoje turime juostą su dviem mygtukais viršuje, kur pirmąjį naudosime kurdami naujus klausimus, o antrąjį - importuodami klausimus (per failą):

Fiksuoti nuo 2013-11-08 00:30:32

Klausimų kūrimas:
Mygtukas, kurį sukūrėme anksčiau (įrankių juostoje) spustelėjęs, atidarysime naują gtk langą, kuris leis mums pridėti klausimų į mūsų duomenų bazę:

app1

Norėdami sukurti naują langą, sukursime naują klasę, kurią vadinsime klausimais ir kaip mūsų „App“ klasė sukurs naują langą (this.window = new Gtk.Window ();)

Norėdami sukurti grafinę sąsają, naudosime kelis komponentus;

-Label (klausimai)

- Įrašas (kur parašysime klausimą)

-Label (atsakymai)

- 4 horizontalūs langeliai, kuriuose bus įrašas (atsakymas) ir jungiklis (norint pasirinkti, ar jis teisingas)

-Mygtukas (užbaigti)

Mes galime pamatyti, kaip tai atrodo:

Fiksuoti nuo 2013-12-08 01:07:08

Norėdami išsaugoti klausimą, turėsime gauti įrašų tekstą, jie gaunami su get_text (), kuris grąžina eilutę.

app5

Norėdami sužinoti, ar jungiklis yra aktyvus, galime naudoti jo metodą gauti_aktyvus (), kuris grįžta į tiesą, jei jis įjungtas, ir įsijungia, jei jis išjungtas.

 50% „Freeze“ ir „Pass“ mygtukai:

 -penkiasdešimt%:

50% turime tik pažiūrėti, kuris mygtukas yra teisingas, ir pašalinti 2 neteisingus mygtukus, šiuo atveju juos atšauksime naudodami set_sensitive (false).

app4

Rezultatas:

app6

-Šaldyti:

Vėl nustatėme juostą į 0.

this.time_bar.set_fraction (0);

-Pass:

button3.clicked.connect (() => {
this.bd_select_preguntas ();
this.next_pregunta();
});

 Kita dalis (4):

Kitoje dalyje pamatysime, kaip patobulinti mūsų programos aspektus, pvz., Kad klausimai ne visada rodomi toje pačioje pozicijoje, įdėkite piktogramą į programą ...


Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.

  1.   f3niX sakė

    Man patinka atsakymai ... haha ​​.. Sveikinimai

  2.   panchomora sakė

    Labai geri šie straipsniai apie valą .. tikiuosi, kad kiti .. sveikinimai

  3.   cr0t0 sakė

    Laukiu jūsų įrašo apie „Vala“, tikiuosi, kad bus daug pristatymų. Cheers!

  4.   pptru sakė

    Gražus straipsnis, ačiū už pasidalinimą.

  5.   Hiramas sakė

    Sveiki,

    Stebėjau ankstesnius jūsų įrašus kuriant šią programą. Problema kyla dabar, kai bandau patekti į naujo lango prieigas, tai darau taip, naudodamas „createQuestions“ klasės (langą kuriančios klasės) metodą saveC.

    public void saveC () {
    eilutė str = questionE.get_text ();
    stdout.printf ("Sutartis% s \ n", str);
    }

    Bet išvesties tai gaunu:
    (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: teiginys „GTK_IS_ENTRY (įrašas)“ nepavyko

    Sutartis (niekinė)

    Aš mačiau keletą pavyzdžių ir apibrėždamas metodus, kurie prieina prie įėjimo, jie daro kažką panašaus:

    void on_activate (Gtk. Įėjimo įrašas) {
    vardas = įrašas.get_text ();
    spausdinti ("\ nSveiki" + vardas + "! \ n \ n");
    }

    Bet jie turi tik vieną įrašą ir šiame pavyzdyje yra 5, taigi čia aš jau pasiklydau, galėtumėte mane geriau nukreipti.

    1.    lolbimbo sakė

      Na, kai kuriate įvestis, nesuteikiate jiems to paties pavadinimo, kad gautumėte tekstą, kurį jūs darote:

      r1 = įrašas1.get_text ();
      r2 = įrašas2.get_text ();
      r3 = įrašas3.get_text ();
      r4 = įrašas4.get_text ();

      Jei norite, įdėkite popierių ir aš jį pažiūrėsiu

      1.    Hiramas sakė

        lolbimbo, jei iš tikrųjų turiu juos skirtingais pavadinimais, bet testams naudoju tik vieną, nes nė vienas iš jų negrąžina teksto, kurį įdėjau į įrašą, jis siunčia man aukščiau minėtą klaidą:

        Bet išvesties tai gaunu:
        (bu: 6196): Gtk-CRITICAL **: gtk_entry_get_text: teiginys „GTK_IS_ENTRY (įrašas)“ nepavyko

        Sutartis (niekinė)

        Aš vis dar tiriu ...

        Cheers. !!

      2.    Hiramas sakė

        Paruošta čia yra šaltinis, sveikinimai.
        http://pastebin.com/pZG8GbrY

    2.    lolbimbo sakė

      Sveiki, Hiramai, pažiūrėk, aš jums pasakysiu, kaip jūs turite tai padaryti, kad išspręstumėte tai, pirmiausia, mes kuriame naują langą (jis nėra pagrindinis), o paskambindamas įrašui (atsiprašau už žodžius) aš nežinau, kodėl Tas šūdas negrįžta taip, lyg tai būtų įrašas, bet valdiklis, bet, hei, norėdami jį išspręsti, tiesiog pakeiskite visus statinius komponentus, kuriuos sukūrėte į dinaminius, naudodami var:

      var questionE = naujas Gtk.Entry ();

      tada funkcija veiks ir gausite tekstą įrašo viduje.

      save.clicked.connect (() => {
      // eilutė str = this.questionE.get_text ();
      stdout.printf ("Sutartis% s \ n", askE.get_text ());
      });

      Galiausiai nepamirškite pakeisti eilutės, į kurią įtraukėte įrašą, kad jis būtų rodomas:

      askE.show ();

      Aš palieku jums visą kodą su modifikacija, kad galėtumėte patikrinti, ar jis jau veikia, ty jei turite tęsti programą, turite pakeisti visus elementus (bent jau įrašus).

      http://paste.desdelinux.net/5048

      saludos

      1.    Hiramas sakė

        Chale, čia vėl varginu, aš vis dar turiu problemų, rodomas kodas yra gerai, tik tuo atveju kažkas atsitinka:

        save.clicked.connect (() => {
        // eilutė str = this.questionE.get_text ();
        stdout.printf ("Sutartis% s \ n", askE.get_text ());
        });

        Jis yra „Klausimų“ klasės viduje ir veikia gerai, bet kai norite patekti iš „saveC“, jis nekompiliuoja, išmeta šią klaidą:

        bu01.vala: 50.38-50.50: klaida: 1 argumentas: negalima konvertuoti iš „Questions.saveC“ į „Gtk.Button.clicked“
        this.guardar.clicked.connect (this.guardarC);
        ^^^^^^^^^^^^^^
        bu01.vala: 251.58-251.66: įspėjimas: Gtk.Stock nebenaudojamas nuo 3.10
        bu01.vala: 260.59-260.67: įspėjimas: Gtk.Stock nebenaudojamas nuo 3.10
        Kompiliacija nepavyko: 1 klaida (-os), 2 įspėjimai (-ai)

        Noriu manyti, kad tai įvyko dėl parametro perdavimo, kai įvyksta paspaudimo įvykis:
        this.guardar.clicked.connect (this.guardarC);

        Iš anksto dėkoju už atsiliepimus; čia palieku klaidos kodą: http://pastebin.com/pLzExhrb

      2.    lolbimbo sakė

        Aš to neišbandžiau, bet manau, kad argumento pašalinimas iš funkcijos jį išmes.

        public void saveC (Gtk. Įrašas prašoE) {
        eilutė str = questionE.get_text ();
        stdout.printf ("Sutartis% s \ n", str);
        }

        a:
        public void saveC () {
        eilutė str = questionE.get_text ();
        stdout.printf ("Sutartis% s \ n", str);
        }

      3.    Hiramas sakė

        lolbimbo, bandžiau pašalinti argumentą ir jis vis dar neveikia,

        Aš vis dar bandau suprasti problemą, esu „Vala“ naujokas ir negaliu rasti daug dokumentų, tikiuosi greitai rasti sprendimą arba laukti, kol išleisite ketvirtąją xD dalį.

        Aš vis bandau ...

        Sveikinimai.