XPCE pavyzdys Spausdinti
( 0 Votes )
Parašė Aurimas Šimkus   

Šioje pamokoje pateikiamas Python programos, turinčios XPCE kurą grafinę vartotojo sąsają, taikomasis pavyzdys.

Išbaigtas variantas: programa - vertėjas/skaičiuotuvas. Programa turi vieną įvesties laukelį ir du mygtukus: vieną - anglų->lietųvių arba lietuvių->anglų (abu variantai veikia) žodžio vertimui (žodžiai: hello, labas, vardas, name, ate, bye); antrą - aritmetinės operacijos atlikimui. Rezultatas išvedamas tame pačiiame įvesties laukelyje.

Programos vaizdas 

 

Kompleksinės XPCE programos realizavimas

Pagrindinės klasės kūrimas 

Kaip ir minėjome, XPCE yra objektiškai paremta technologija. Norint realizuoti sudėtingesnes, ilga gyvavimo ciklą palaikančias XPCE programas, reikia susikurti grafinio objekto (lango) klasę.

Prieš klasės kūrimą, reikia prisijungti XPCE modulį. Tai galite padaryti failo viršuje užrašydami:

     :- use_module(library(pce)).

Dabar galime kurti pačia klasę. Klasė įreminama tarp dviejų predikatų:

     :- pce_begin_class(klaseGVS, dialog).
        ...
     :- pce_end_class.

Kaip matote, kalsės apraše nurodomi du parametrai: klaseGVS - bet koks iš mažosios raidės rašomas ir jūsų pačių pasirenkamas klasės pavadinimas; dialog - klasės (grafinio objekto) tipas.

Klasės viduje aprašomas klasės konstruktorius - initialise. Taip pat gali būti aprašomi ir metodai, tačiau mes jų nenagrinėsim, programos operacijoms atlikti naudosim tradininius Prolog predikatus.

Konstruktoriaus aprašas:

   initialise(GVS) :->
      send(GVS, send_super, initialise, 'GVS'),

GVS - klasės vidinis objektas (kintamasis), kurio pavadinimą galime pasirinkti laisvai. Antrojoje eilutėje inicializuojama šį klasės objektą, pradedame jo gyvavimo ciklą. Ketvirtajame parametre neiužmirškite apostrofų!

Toliau konstruktoriuje apsirašome valdymo elementus, kuriuos norėsime naudoti programoje. Pirmiausiai apsirašome įvesties lauką:

   send(GVS, append, new(Ivestis, text_item(ivestis, ''))),

Pirmasis parametras - klasės objektas, antrasis nurodo, kad bus pildomas objektas (pridedamas naujas elementas). Trečiame parametre inicializuojame šį elementą - įvesties lauką (text_item). Ivestis - vidinis elemento kintamasis klasės ribose, ivestis - elemento pavadinimas, iš jo formuojamas ir prierašas prie lauko. Antrame text_item parametre tarp apostrofų galima nurodyti pradinį rodomą tekstą.

Toliau inicializuosime mygtukus. kadangi abiejų jų realizacija tokia pati, tai aptarsime tik vieną.

   send(GVS, append,
                  button(isversti,
                             message(@prolog,versti,GVS,Ivestis?selection))),

Pradžia tokia pati kaip ir kiekvieno elemento inicializacijoje, aptarsime mygtuko - button parametrus. Parametras isversti - mygtuko objekto pavadinimas, iš jo formuojamas ir tekstas ant vaizduojamo mygtuko. Predikatas message aprašo tai, su kokiais argumentais į kurią Prolog procedūrą bus kreipiamasi nuspaudus mygtuką. versti - iškviečiamos prolog procedūros pavadinimas. Toliau aprašomi du siunčiami argumentai: GVS - nuoroda į klasės objektą, Ivestis?selection - įvesties laukelyje įvestas tekstas.

Taigi jau aptarėme klasės aparaša, visas jos kodas turėtų būti toks:

:- use_module(library(pce)).

:- pce_begin_class(klaseGVS, dialog).
   initialise(GVS) :->
      send(GVS, send_super, initialise, 'GVS'),
      send(GVS, append, new(Ivestis, text_item(ivestis, ''))),
      send(GVS, append,
                     button(isversti,
                               message(@prolog,versti,GVS,Ivestis?selection))),
      send(GVS, append,
                     button(apskaiciuoti,
                               message(@prolog,skaiciuoti,GVS,Ivestis?selection))).
:- pce_end_class.

 

Prolog struktūrų kūrimas

Taigi Prolog dalyje dar turime aprašyti po mygtukų paspaudimų kviečiamas versti ir skaiciuoti bei jų naudojamas kitas procedūras.

Procedūros versti aprašas:

versti(GVSobj,Gauta) :-
    vertimas(Gauta,Ats),
    get(GVSobj,member,ivestis,IvestisObj),
    send(IvestisObj,selection,Ats).

GVSobj - klasės objekto nuoroda, Gauta - siunčiamas tekstas iš įvesties laukelio. Pirmiausia kreipiamės į kitą procedūrą - vertimas/2, į kurią siunčiame gautą teksta, ir nurodome kintamąjį Ats, su kuriuo turėtume gauti atsakymą. Tada su predikatu get (nurodę klasės objektą ir tai, kad ieškome jo elemento, kurio pavadinimas - ivestis) gauname įvesties laukelio objektą IvestisObj. Turėdami šį objektą kitu predikatu send galime pakeisti įvesties laukelyje esantį tekstą į Ats.

Procedura vertimas ir vertimų faktai:

lt_en(labas, hello).
lt_en(ate, bye).
lt_en(vardas, name).

vertimas(Zodis, Vertimas) :-
   lt_en(Zodis, Vertimas); lt_en(Vertimas, Zodis).

Faktais lt_en yra aprašoma vertimų duomenų bazė. Taisyklė vertimas - atlieka abipusį vertimą (iš anglų į lietuvių arba iš lietvių į angų): iš pradžių tikrinama, ar gaunamam kintamajam Zodis egzistuoja vertimas iš lietuvių kalbos, jei ne (predikatas ; reiškia arba), tikrinama, ar egzsistuoja vertimas iš anglų kalbos.

Procedūros skaiciuoti ir jos naudojamų procedūtų aprašas:

skaiciuoti(GVSobj,Gauta) :-
   skaiciuokle(Gauta, Ats),
   get(GVSobj,member,ivestis,IvestisObj),
   send(IvestisObj,selection,Ats).
 
skaiciuokle(Salyga, Ats) :-
   read_term_from_codes(Salyga, X, []),
   Ats is X.

Procedūros skaiciuoti formatas nesiskiria nuo procedūros versti, todėl jos neaptarsime. Jos naudojamoje procedūroje skaiciuokle, panaudotas predikatas read_term_from_codes/3. Jis skirtas teksto eilutės konvertavimui į termą (XPCE iš įvesties laukelio grąžina simbolių eilutę). Mums tai reikalinga, kadangi naudojame predikatą is, kuris Kintamajam Ats priskiria apskaičiuotą aritmetinę operaciją, kuri turi būti aprašyta termu.

Paskutinė procedūra - programos paleidimas.

run :- new(GVSobj,klaseGVS),
   send(GVSobj,open).

Predikatu new sukuriamas naujas klasės klaseGVS objektas GVSobj. Predikatu send šis objektas yra iškviečiamas (atidaromas programos langas).

 

Programos realizacija - kodas 

:- use_module(library(pce)).

:- pce_begin_class(klaseGVS, dialog).
  initialise(GVS) :->
    send(GVS, send_super, initialise, 'GVS'),
    send(GVS, append, new(Ivestis, text_item(ivestis, ''))),
    send(GVS, append,
                   button(isversti,
                             message(@prolog,versti,GVS,Ivestis?selection))),
    send(GVS, append,
                   button(apskaiciuoti,
                             message(@prolog,skaiciuoti,GVS,Ivestis?selection))).
:- pce_end_class.

lt_en(labas, hello).
lt_en(ate, bye).
lt_en(vardas, name).
vertimas(Zodis, Vertimas) :-
 lt_en(Zodis, Vertimas); lt_en(Vertimas, Zodis).

skaiciuokle(Salyga, Ats) :-
   read_term_from_codes(Salyga, X, []),
   Ats is X.

skaiciuoti(GVSobj,Gauta) :-
   skaiciuokle(Gauta, Ats),
   get(GVSobj,member,ivestis,IvestisObj),
   send(IvestisObj,selection,Ats).

versti(GVSobj,Gauta) :-
   vertimas(Gauta,Ats),
   get(GVSobj,member,ivestis,IvestisObj),
   send(IvestisObj,selection,Ats).

run :- new(GVSobj,klaseGVS),
   send(GVSobj,open).