Bazele de scriere a aplicațiilor GUI cu wxWidgets
Scrierea aplicațiilor GUI pe Perl nu diferă de scrierea în alte limbi dinamice. Totul depinde de calitatea ambalajelor peste bibliotecile originale și de actualizarea lor la timp.
De ce wxWidgets?
wxWidgets este un set de instrumente GUI cu adevărat cross-platform. Spre deosebire, de exemplu, de Qt. care, de asemenea, pare a fi cross-platform, wxWidget folosește bibliotecile native pe platformele lansate, mai degrabă decât să încerce să le imite. Astfel, aplicațiile nu arată la fel la fel, dar este destul de obișnuit pentru propriul dvs. shell grafic.
Configurarea mediului
Pentru dezvoltare, folosesc platforma GNU / Linux. Prin urmare, instalarea wxWidgets este pentru sistemul meu de operare. Cea mai ușoară cale este să instalați bibliotecile din pachetele de distribuție, utilizând exemplul Debian:
Desigur, puteți instala întotdeauna cu CPAN, dar atunci trebuie să compilați o mulțime și vă puteți împiedica de incompatibilitatea versiunilor.
Prima cerere
Prima aplicație standard este o fereastră pe care se afișează "Bună ziua, lume!":
Wx :: Frame este o fereastră care poate fi redimensionată, poate avea o bară de stare, precum și un meniu. Ie aceasta este o fereastră cu scop general. În plus față de Wx :: Frame, există, de asemenea, Wx :: Dialog și altele. Pentru a adăuga elemente vizuale, puteți folosi diferite clase și metode de lucru wxWidgets. De exemplu, pentru a adăuga un buton care închide aplicația, scrieți următorul cod:
Toate metodele, evenimentele etc. bine documentate în documentația wxWidgets. Nu vom mai vorbi în detaliu. Să luăm în considerare abordarea generală în scris a aplicațiilor GUI.
Generatoare de interfață XML
Pentru o aplicație mică, acest lucru este destul de acceptabil, precum și pentru un script Perl simplu puteți scrie totul într-un singur fișier. Cu toate acestea, acest lucru este foarte incomod pentru aplicații mari, cu o mulțime de ferestre, dialoguri, logică complexă.
Pentru aplicațiile grafice, se aplică aceeași abordare ca și pentru aplicațiile web - MVC, sau separarea logicii de afaceri, a cartografierii și a managementului. Puteți face același lucru și cu programul GUI.
Pentru a construi o interfață, este mai bine să folosiți programe speciale care generează setări XML (fișiere XRC), care, atunci când sunt încărcate în aplicație, sunt transformate într-o interfață grafică. Este mult mai ușor de întreținut și mai ușor de schimbat.
Există mai multe astfel de generatoare pentru wxWidgets. Cel mai complet este wxFormBuilder. Vă permite să creați toate tipurile de elemente, să specificați locația acestora pe ferestre etc.
De exemplu, fișierul XRC pentru aplicația anterioară poate arăta astfel:
Acum încărcați această configurație în aplicație:
Pentru a obține un obiect Wx :: Frame. utilizați metoda LoadFrame:
Și pentru a obține obiectul buton, mai întâi primim numele său id:
Și apoi ne asociem evenimentul.
Merită întotdeauna să apelați în mod explicit toate elementele și să nu lăsați ceva de genul m_Button_1. acest lucru va face codul de control mult mai clar.
Separarea în clase
Ca orice aplicație Perl, împărțirea în pachete și clase individuale simplifică înțelegerea codului, face posibilă testarea claselor individuale și, de asemenea, vă permite să moșteniți și să modificați ușor comportamentul elementelor grafice.
Împărțim aplicația noastră în mai multe componente.
Clasa principală de aplicații
Sarcina clasei de bază este încărcarea setărilor, crearea ferestrei principale și afișarea acesteia.
Clasa ferestrelor principale
Sarcina acestei clase este de a configura fereastra proprie, adică înregistrați toate evenimentele, în acest caz făcând clic pe butonul CloseButton.
Script de pornire
Scenariul de pornire app.pl este punctul de intrare pentru lansarea aplicației.
Cu ajutorul unei astfel de descompuneri, fiecare clasă este implicată în propria afacere, iar structura aplicației este următoarea:
Este posibil ca fiecare clasă să facă un prefix unic, de exemplu GUI, pentru a le distinge de clasele obișnuite Perl, care se vor ocupa de logica aplicației.
Generatoare de coduri Perl
wxFormBuilder. după cum sa menționat deja, poate genera o reprezentare XML, dar vă permite de asemenea să generați cod. Din păcate, din cutie nu există suport pentru generarea codului Perl. Cu toate acestea, dezvoltatorii Padre și-au implementat propriul generator de coduri Perl din fișierul proiectului wxFormBuilder. Acest lucru necesită două module: FBP și FBP :: Perl. Scriind cel mai simplu script pentru crearea de clase, obținem ieșirea arborelui fișierului, în care fiecare este o fereastră separată:
În plus, această abordare este și în faptul că nu este necesar să legați manual semnalele de elementele. Specificând numele manipulatorului în wxFormBuilder, PBP :: Perl va genera corect codul corespunzător. Iată cum arată, de exemplu, clasa principală a formelor:
Cum putem folosi aceste clase? Nu este nevoie să adăugați funcționalitate la acestea, deoarece acestea sunt generate automat din fișierul proiectului. Soluția cea mai corectă ar fi să moștenim din clasa generată și să implementăm deja codul necesar. În plus, este logic să se genereze clase cu un anumit prefix care să clarifice clasele care sunt automate și care sunt scrise manual.
Iată implementarea procesatorului de evenimente OnClick din clasa copil:
Proiectul care utilizează clasele generate arată astfel:
simple.fbp este fișierul proiectului wxFormBuilder, iar gener.pl este scriptul pentru generare.
Modulul MyApp.pm va trebui, de asemenea, să fie scris manual, dar codul său este foarte simplu:
Și app.pl rămâne același ca și în cazul unei reprezentări XML.
Separarea logicii
Așa cum am menționat deja, atunci când scriem aplicații grafice, reprezentarea și logica reală a aplicației însăși este împărțită. În mod ideal, în cazul în care aplicația este implementată în așa fel încât înlocuirea unei biblioteci grafice diferite, sau o aplicație web sau o versiune consola nu ar implica nici o sau ca Min, fără modificări majore.
De exemplu, dacă o aplicație trebuie să facă o solicitare pe un site Web pentru a prelua unele date, merită să o alocați unei clase separate care nu depinde de biblioteca grafică. Acest lucru va face mult mai ușor să-l testați cu ajutorul unor instrumente standard. În cazul testării programelor grafice, este mult mai dificil.
Cu toate acestea, testarea interfețelor grafice este, de asemenea, posibilă și necesară, de exemplu, cu ajutorul testelor de seleniu și a aplicațiilor web. Pentru X11, există un set de instrumente Xnee. care vă permite să scrieți scripturi și apoi să le efectuați în modul automat.
blocarea
Dacă scrieți aplicații serioase pe wxWidgets. În curând veți observa că atunci când efectuați activități care necesită timp, fereastra activă este blocată și pare să înghețe. E vorba de blocare. În timpul executării codului dvs., wxWidgets așteaptă până termină.
Modul standard de a rezolva această problemă este utilizarea de fire (fire, fire) atunci când sarcinile care trebuie executate în fundal sunt executate într-un fir separat. În acest caz, fereastra nu este blocată, iar după terminarea sarcinii, fereastra principală primește un răspuns și o procesează.
În plus față de fire, este posibil să se utilizeze cadre asincrone de tip POE. Linux poate folosi wxGTK. și cu ea AnyEvent. În acest caz, este necesar să se scrie un cod orientat spre eveniment, cu toate avantajele și dezavantajele acestuia din urmă.
Este, de asemenea, posibil să efectuați sarcini de fundal într-un proces separat folosind wxExecute. dar este mai potrivit pentru rularea aplicațiilor terță parte.
Executarea sarcinilor într-un fir separat
Cea mai obișnuită și mai ușoară modalitate de a realiza o sarcină în fundal este folosirea firelor. Pentru a utiliza fire cu Wx. este necesar, în primul rând, să vă asigurați că perl este compilat cu suporturi de fire:
În al doilea rând, conectați pragma thread-urilor la conexiunea Wx (ar trebui să se facă și în scriptul de lansare a aplicației):
De exemplu, când faceți clic pe un buton, dorim să executăm un cod și să notifăm aplicația principală a rezultatului. Scheletul unei astfel de aplicații va arăta astfel:
Variabilele cu o etichetă partajată sunt necesare pentru a face schimb de date între fire, deoarece firele sunt executate simultan, iar utilizarea variabilelor obișnuite nu este sigură. Wx va vedea că variabilele sunt declarate ca partajate. asigurând astfel programatorului.
În această aplicație, când se face clic pe buton, se înregistrează procedura de tratare a evenimentului pentru eveniment, apoi este creat un fir pentru a efectua lucrarea. Când firul se termină, semnalează aplicația principală cu privire la rezultatele sale. Aplicația principală înregistrată anterior primește datele și efectuează anumite acțiuni pentru a afișa rezultatul.
Proiectarea codului în acest mod, adică când executați codul în fundal, puteți scrie modulele Perl obișnuite complet independent de biblioteca grafică.
Exemple de aplicații
De exemplu, vom scrie o aplicație care primește cele zece cele mai recente module descărcate de la MetaCPAN și le afișează într-o listă.
Mai întâi implementăm modelul, adică baza cererii. În cazul nostru, acesta este modulul care va primi cele mai recente distribuții adăugate. Poate arata astfel:
Mai multe detalii despre modul de lucru cu API-ul MetaCPAN pot fi găsite în documentație. Există, de asemenea, multe exemple.
afișa
Aplicația grafică va fi o singură fereastră cu un buton Fetch și o listă. Când faceți clic pe un buton într-un fir separat, creați un obiect al clasei ModulesFetcher și returnați rezultatul. Aplicația grafică principală procesează rezultatul și umple lista.
Scheletul întregii aplicații a fost deja descris de noi mai sus, deci aici arătăm doar un exemplu de utilizare a unui modul terț:
În metoda de lucru se numește metoda de preluare a obiectului model, apoi rezultatul este convertit la variabila partajată, iar un semnal este generat în fereastra principală cu transferul de rezultate.
În metoda finalizată, preluăm datele primite din eveniment folosind metoda GetData și apoi le adăugăm în obiectul listă într-o buclă. Înainte de aceasta, nu uitați să ștergeți datele vechi.
Pentru a scrie aplicații grafice pe Perl este posibil cu succes. Folosind biblioteca wxWidgets, acest lucru este de asemenea simplu. Distribuirea corectă a modelului și cartografiere, puteți realiza portabilitatea între diferitele biblioteci grafice, precum și simplifica implementarea.