<<

Zadání diplomové práce

Název: Python GUI: API pro Student: Bc. Matěj Schuh Vedoucí: Ing. Miroslav Hrončok Studijní program: Informatika Obor / specializace: Webové a softwarové inženýrství, zaměření Softwarové inženýrství Katedra: Katedra softwarového inženýrství Platnost zadání: do konce letního semestru 2021/2022

Pokyny pro vypracování

Analyzujte API knihovny Tkinter ze standardní knihovny jazyka Python. Analyzujte API frameworku Qt a jeho nadstaveb pro jazyk Python (PyQt, PySide). Analyzujte možnosti, jak mapovat Tkinter API na GUI komponenty frameworku Qt. Navrhněte implementaci těch možností, které dávají smysl. Navrhněte kvantifikátory pro měření úspěšnosti mapování Tkinter API na GUI komponenty frameworku Qt. Zvolte jednu z možností implementace a implementujte prototyp jako knihovnu pro Python pod permisivní svobodnou licencí. Součástí implementace musí být automatické testy a anglická dokumentace. Implementaci otestujte na aplikaci Python IDLE podle definovaných kvantifikátorů.

Elektronicky schválil/a Ing. Michal Valenta, Ph.. dne 24. února 2020 v Praze.

Diplomov´apr´ace

Python GUI: Tkinter API pro Qt

Bc. MatˇejSchuh

Katedra softwarov´ehoinˇzen´yrstv´ı Vedouc´ıpr´ace:Ing. Miroslav Hronˇcok

6. kvˇetna2021

Podˇekov´an´ı

Na tomto m´ıstˇebych chtˇelpˇrednostnˇepodˇekovat sv´emu vedouc´ımu Ing. Mi- roslavu Hronˇcokovi, kter´ymi vˇzdypomohl s implementac´ı,n´avrhemi smˇerem m´eDiplomov´epr´ace.D´alebych chtˇelpodˇekovat rodinˇea pˇr´atel˚um,kteˇr´ımi byli bˇehemzpracov´av´an´ıoporou.

Prohl´aˇsen´ı

Prohlaˇsuji,ˇzejsem pˇredloˇzenoupr´acivypracoval samostatnˇea ˇzejsem uvedl veˇsker´epouˇzit´einformaˇcn´ızdroje v souladu s Metodick´ympokynem o dodrˇzo- v´an´ıetick´ych princip˚upˇripˇr´ıpravˇevysokoˇskolsk´ych z´avˇereˇcn´ych prac´ı. Beru na vˇedom´ı,ˇzese na moji pr´acivztahuj´ıpr´ava a povinnosti vypl´yvaj´ıc´ı ze z´akona ˇc.121/2000 Sb., autorsk´ehoz´akona, ve znˇen´ıpozdˇejˇs´ıch pˇredpis˚u. V souladu s ust. § 2373 odst. 2 z´akona ˇc.89/2012 Sb., obˇcansk´yz´akon´ık,ve znˇen´ıpozdˇejˇs´ıch pˇredpis˚u,t´ımto udˇelujinev´yhradn´ıopr´avnˇen´ı(licenci) k uˇzit´ı t´etomoj´ıpr´ace,a to vˇcetnˇevˇsech poˇc´ıtaˇcov´ych program˚u,jeˇzjsou jej´ısouˇc´ast´ı ˇcipˇr´ılohoua veˇsker´ejejich dokumentace (d´alesouhrnnˇejen D´ılo“), a to ” vˇsemosob´am,kter´esi pˇrej´ıD´ılouˇz´ıt.Tyto osoby jsou opr´avnˇeny D´ılouˇz´ıt jak´ymkoli zp˚usobem, kter´ynesniˇzujehodnotu D´ılaa za jak´ymkoli ´uˇcelem (vˇcetnˇeuˇzit´ık v´ydˇeleˇcn´ym´uˇcel˚um).Toto opr´avnˇen´ıje ˇcasovˇe,teritori´alnˇe i mnoˇzstevnˇeneomezen´e.Kaˇzd´aosoba, kter´avyuˇzijev´yˇseuvedenou licenci, se vˇsakzavazuje udˇelitke kaˇzd´emu d´ılu,kter´evznikne (byt’ jen zˇc´asti)na z´akladˇeD´ıla, ´upravou D´ıla,spojen´ımD´ılas jin´ymd´ılem,zaˇrazen´ımD´ıla do d´ılasouborn´ehoˇcizpracov´an´ımD´ıla(vˇcetnˇepˇrekladu)licenci alespoˇn ve v´yˇseuveden´emrozsahu a z´aroveˇnzpˇr´ıstupnitzdrojov´yk´odtakov´ehod´ıla alespoˇnsrovnateln´ymzp˚usobem a ve srovnateln´emrozsahu, jako je zpˇr´ıstupnˇen zdrojov´yk´odD´ıla.

V Praze dne 6. kvˇetna2021 ...... Cesk´evysok´euˇcen´ıtechnick´evˇ Praze Fakulta informaˇcn´ıch technologi´ı 2021 MatˇejSchuh. Vˇsechna pr´ava vyhrazena. Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Cesk´emvysok´emuˇcen´ıˇ technick´em v Praze, Fakultˇeinformaˇcn´ıchtechnologi´ı.Pr´ace je chr´anˇenapr´avn´ımipˇredpisy a mezin´arodn´ımi´umluvamio pr´avuautorsk´ema pr´avech souvisej´ıc´ıchs pr´avem autorsk´ym.K jej´ımuuˇzit´ı,s v´yjimkoubez´uplatn´ychz´akonn´ychlicenc´ıa nad r´amec opr´avnˇen´ıuveden´ychv Prohl´aˇsen´ına pˇredchoz´ıstranˇe,je nezbytn´y souhlas autora.

Odkaz na tuto pr´aci Schuh, Matˇej. Python GUI: Tkinter API pro Qt. Diplomov´apr´ace. Praha: Cesk´evysok´euˇcen´ıtechnick´evˇ Praze, Fakulta informaˇcn´ıch technologi´ı,2021. Dostupn´ytak´ez WWW: hhttps://github.com/SohajCZ/dumpTki. Abstrakt

Tato Diplomov´apr´aceje zamˇeˇrenana tvorbu grafick´ehouˇzivatelsk´ehorozhran´ı v jazyce Python. Grafick´erozhran´ıvyuˇz´ıvaj´ıgrafick´ych moˇznost´ıpoˇc´ıtaˇc˚ua dalˇs´ıch zaˇr´ızen´ıch pro zjednoduˇsen´ıkomunikace mezi poˇc´ıtaˇcem a uˇzivatelem, d´ıkyˇcemuˇzm˚uˇzeb´ytpoˇc´ıtaˇcovl´ad´ani m´enˇezkuˇsen´ymuˇzivatelem. Teoretick´aˇc´astpr´aceje vˇenov´anavlastn´ımu grafick´emu rozhran´ıa jeho komponent˚um,s d˚urazemna moˇznostiimplementace grafick´ehorozhran´ıv pro- gramovac´ımjazyku Python, pomoc´ıknihovny Tkinter, vyuˇz´ıvaj´ıc´ıTk kompo- nenty, nebo bal´ıˇckyPyQt a PySide, vyuˇz´ıvaj´ıc´ıch komponenty z frameworku Qt. C´ılempraktick´eˇc´astije anal´yzaa n´avrhˇreˇsen´ı,kter´eby umoˇzniloaplikac´ım pouˇz´ıvaj´ıc´ımknihovnu Tkinter vyuˇz´ıvat k vykreslen´ıgrafick´ehorozhran´ıkom- ponenty z frameworku Qt. K navrˇzen´emu ˇreˇsen´ıje implementov´anprototyp, na kter´emje zhodnocena ´uspˇeˇsnostn´avrhu. Pr´aceposkytuje pˇrehledo moˇznostech grafick´ehouˇzivatelsk´eho rozhran´ı, jeho stavebn´ıch prvc´ıch a o jeho moˇznostech implementace v Pythonu. Pr´ace m˚uˇze b´ytpˇr´ınosn´anejen pro ty, kteˇr´ıse chtˇejidozvˇedˇetv´ıceo vnitˇrn´ıch funkc´ıch a z´avislostech Tkinteru, PyQt a PySide, ale rovnˇeˇztˇem,kter´ymnevyhovuj´ı k tvoˇren´ırozhran´ıTk komponenty, ale chtˇej´ızachovat moˇznosti programov´an´ı pomoc´ıTkinteru.

Kl´ıˇcov´a slova API, GUI, PyQt, Python, Qt, , , Tkinter

vii Abstract

This diploma thesis is focused on the creation of graphics Python user interface. Graphical interfaces are using graphical capabilities of computers to simplify communication between the computer and the user, making it possible the computer is controlled even by a less experienced user. The theoretical part of the work is devoted to graphical interface and its components, with emphasis on the possibility of implementing a graphical interface in the Python , using the Tkinter with Tk components or PyQt and PySide bindings using components from the Qt framework. The aim of the practical part is the analysis and design of solution, which would allow applications using the Tkinter library to draw a graphical interface components from the Qt framework. To the designed solution is then prototype implemented and evaluated. This diploma thesis provides an overview of the possibilities of , its components and its implementation options in Python. The work can be beneficial not only for those who seek how Tkinter, PyQt or PySide work internally, but also for those that don’t like to create an interface with Tk components, but want maintain programming capabilities of Tkinter library.

Keywords API, GUI, PyQt, Python, Qt, Tcl, Tk, Tkinter

viii Obsah

Uvod´ 1

1 C´ıl pr´ace 3

2 Teoretick´a ˇc´ast 5 2.1 Python ...... 5 2.2 Interaktivn´ıpˇr´ıstup...... 6 2.3 GUI ...... 6 2.3.1 Komponenty GUI ...... 6 2.3.2 Interakce ...... 8 2.3.3 Sada n´astroj˚u...... 8 2.4 Tkinter ...... 10 2.4.1 Tcl/Tk ...... 11 2.5 PyQt, PySide ...... 12 2.5.1 Qt ...... 12 2.5.2 PyQt ...... 13 2.5.3 PySide ...... 13 2.5.4 Rozd´ılyPyQt a PySide ...... 13 2.6 Srovn´an´ı...... 14 2.7 Motivace ...... 15

3 Analyza´ 19 3.1 Tkinter ...... 19 3.1.1 Spr´avci rozloˇzen´ı ...... 19 3.1.2 Standardn´ıatributy ...... 20 3.1.3 Ud´alosti ...... 21 3.1.4 Modul ttk ...... 22 3.1.5 Dialogy ...... 23 3.2 PyQt ...... 23 3.2.1 QWidget ...... 24

ix 3.2.2 Ud´alosti...... 24 3.2.3 Moˇznostizobrazen´ıwidget˚u...... 25 3.2.4 Management rozloˇzen´ıwidget˚u...... 26 3.2.5 Dialogy ...... 27 3.3 PySide ...... 27

4 N´avrh 29 4.1 Mapov´an´ı ...... 29 4.1.1 High-level rozhran´ı ...... 29 4.1.2 Mapov´an´ıv niˇzˇs´ıch ´urovn´ıch ...... 30 4.1.3 Mapov´an´ıv r˚uzn´ych ´urovn´ıch ...... 31 4.1.4 Vybran´yzp˚usob mapov´an´ı...... 32 4.2 N´avrhkvantifik´ator˚u...... 33

5 Realizace 35 5.1 Struktura repozit´aˇre ...... 35 5.2 Qtinter ...... 35 5.3 Implementer ...... 37 5.4 Pˇrekladud´alost´ı ...... 39 5.5 Podpora ud´alost´ı ...... 39 5.6 pro nahr´an´ısouboru ...... 40 5.7 Layouter ...... 40 5.8 QtCore konstanty ...... 42 5.9 Mapov´an´ıparametr˚u...... 42 5.10 Pˇrekladdle mapov´an´ı- tktoqt ...... 43

6 Testov´an´ı a zhodnocen´ı 45 6.1 Regresn´ıtestov´an´ı ...... 45 6.2 Otestov´an´ıs aplikac´ıIDLE ...... 46 6.3 Zhodnocen´ıdle kvantifik´ator˚u...... 47

Z´avˇer 49

Literatura 51

A Seznam pouˇzitych´ zkratek 55

B Obsah pˇriloˇzen´eho CD 57

x Seznam obr´azk˚u

4.1 Mapov´an´ıv niˇzˇs´ıch ´urovn´ıch ...... 30 4.2 Hello world program ...... 32 4.3 N-tice vygenerovan´eprogramem Hello world ...... 32

5.1 Struktura repozit´aˇre ...... 36 5.2 Uk´azkamapovac´ıch struktur ...... 44

xi

Uvod´

Tato Diplomov´apr´aceje zamˇeˇrenana tvorbu grafick´ehouˇzivatelsk´ehorozhran´ı v jazyce Python. Grafick´erozhran´ıvyuˇz´ıvaj´ıgrafick´ych moˇznost´ıpoˇc´ıtaˇc˚ua dalˇs´ıch zaˇr´ızen´ıch pro zjednoduˇsen´ıkomunikace mezi poˇc´ıtaˇcem a uˇzivatelem, d´ıkyˇcemuˇzm˚uˇzeb´ytpoˇc´ıtaˇcovl´ad´ani m´enˇezkuˇsen´ymuˇzivatelem. Teoretick´aˇc´astt´etoDiplomov´epr´acese vˇenuje obecnˇepojmu grafick´eho uˇzivatelsk´ehorozhran´ı(GUI), popisuje jeho komponenty a moˇznosti interakce s uˇzivatelem. D´aleteoretick´aˇc´astpr´acepopisuje nutn´epojmy souvisej´ıc´ı s tvorbou GUI, souˇcasnˇes pˇredstaven´ımexistuj´ıc´ıch sad n´astroj˚u,jako jsou Tk a Qt, knihovny Tkinter a bal´ıˇckyPyQt a PySide pro programovac´ıjazyk Python. Tyto n´astroje a bal´ıˇckyteoretick´aˇc´astdetailnˇepopisuje a mezi sebou vz´ajemnˇesrovn´av´a.Teoretick´aˇc´astje zakonˇcenashrnut´ımmotivace ke zpracov´an´ıtohoto t´ematu. Praktick´aˇc´astt´etoDiplomov´epr´acese vˇenuje implementaci n´astroje, kter´yby umoˇznilaplikac´ımnapsan´ympomoc´ıknihovny Tkinter vyuˇz´ıvat komponenty ze sady n´astroj˚uQt m´ıstosady Tk. Praktick´aˇc´astse dˇel´ına ˇctyˇri ˇc´asti– anal´yzu,n´avrh,realizaci a testov´an´ı. Anal´yzase bl´ıˇzevˇenuje knihovnˇeTkinter a bal´ıˇck˚um PyQt a PySide. Prob´ır´adetailnˇespr´avce rozloˇzen´ı,ud´alosti,dialogy a dalˇs´ımfunkce GUI. C´astˇ n´avrhu je vˇenov´anan´avrh˚ummapov´an´ı,pomoc´ıkter´ych by mˇelo b´ytdosaˇzeno c´ılepr´ace.Navrˇzen´amapov´an´ıTkinteru na Qt komponenty jsou zkoum´any z hlediska navrˇzen´ych parametr˚u,dle kter´ych dojde k v´ybˇerumapovan´ıpro implementaci. N´avrhje zakonˇcendefinov´an´ım kvantifik´ator˚u,kter´ezmˇeˇr´ı ´uspˇeˇsnostimplementovan´ehomapov´an´ı. C´astrealizaceˇ popisuje implementovan´yprototyp mapov´an´ı,vˇcetnˇevˇsech jeho moˇznost´ı,vysvˇetlen´ın´avrhov´ych rozhodnut´ıa dalˇs´ıch detail˚u.V posledn´ı ˇc´astije pops´anproces testov´an´ıimplementovan´ehoprototypu a prototyp je testov´anna aplikaci IDLE. C´asttestov´an´ıjeˇ ukonˇcenazhodnocen´ımimple- mentovan´ehoprototypu dle definovan´ych kvantifik´ator˚u.

1

Kapitola 1

C´ılpr´ace

1. Analyzujte API knihovny Tkinter ze standardn´ıknihovny jazyka Python.

2. Analyzujte API frameworku Qt a jeho nadstaveb pro jazyk Python (PyQt, PySide).

3. Analyzujte moˇznosti,jak mapovat Tkinter API na GUI komponenty frameworku Qt.

4. Navrhnˇeteimplementaci tˇech moˇznost´ı,kter´ed´avaj´ısmysl.

5. Navrhnˇetekvantifik´atorypro mˇeˇren´ı´uspˇeˇsnosti mapov´an´ıTkinter API na GUI komponenty frameworku Qt.

6. Zvolte jednu z moˇznost´ıimplementace a implementujte prototyp jako knihovnu pro Python pod permisivn´ısvobodnou licenc´ı.Souˇc´ast´ıimple- mentace mus´ıb´ytautomatick´etesty a anglick´adokumentace.

7. Implementaci otestujte na aplikaci Python IDLE podle definovan´ych kvantifik´ator˚u.

3

Kapitola 2

Teoretick´aˇc´ast

Teoretick´aˇc´astpr´aceje nejprve vˇenov´anabliˇzˇs´ımu pˇribl´ıˇzen´ıpojmu grafick´eho uˇzivatelsk´ehorozhran´ıa jeho standardn´ımkomponent˚um.V dalˇs´ıch kapitol´ach t´etoˇc´astise vˇenuji moˇznostemimplementace GUI v Pythonu, pomoc´ıknihovny Tkinter a bal´ıˇck˚uPyQt a PySide.

2.1 Python

Python je modern´ıprogramovac´ıjazyk vyvinut´yGuido van Rossumem. Je to interpretovan´y,platformnˇenez´avisl´y,interaktivn´ıa objektovˇeorientovan´y jazyk. Pˇredstavuje ˇsirokou paletu moˇznost´ı, d´ıky ˇcemuˇzumoˇzˇnujerychle vytv´aˇretaplikace rychleji neˇzv tradiˇcn´ıch jazyc´ıch, jako jsou C, C++, nebo Java1. Python je od poˇc´atkuvyv´ıjenjako otevˇren´ysoftware pod licenc´ıPython Software Foundation Licence (PSFL) [1, 3-14]. Shrnut´ıvlastnost´ıPythonu:

• Python disponuje automatickou spr´avou pamˇeti.

• Jednoduch´asyntaxe a s´emantika.

• Pouˇziteln´ypro skriptov´an´ıi rozs´ahl´eprogramy.

• Vyspˇel´aasociativn´ıpole, rozˇs´ıˇriteln´asyntaxe tˇr´ıd.

• V´ykonn´eknihovny pro numerick´ev´ypoˇcty, uˇzivatelsk´arozhran´ı,manipu- lace s obr´azkya dalˇs´ı.

• Podpora ˇsirok´ekomunity uˇzivatel˚u.

• Snadn´aintegrace s jin´ymiprogramovac´ımijazyky [1, 14].

1Dle m´ehon´azorusi tak´ez´ıskalmnoho pˇr´ıznivc˚ud´ıkysv´esyntaxi odpov´ıdaj´ıc´ıpseudok´odu.

5 2. Teoreticka´ cˇast´

2.2 Interaktivn´ıpˇr´ıstup

Python m´aod verze 1.5.2 (rok 1999) 2 moˇznostispuˇstˇen´ı: 1. Z´akladn´ıreˇzim– Spuˇstˇen´ıpod Unixem pomoc´ıpˇr´ıkazu‘python‘.

2. IDLE – Integrated DeveLopment Environment – Po vstupu do tohoto n´astroje je uˇzivateli zpˇr´ıstupnˇenz´akladn´ı reˇzim,ale v aplikaci, bez nutnosti zapnut´ıtermin´alu.IDLE nab´ız´ımoˇznostijako automatick´e ˇr´adkov´an´ı,zv´yraznˇen´ısyntaxe a pohyb ve zdrojov´emk´odupomoc´ıob- vykl´ych ovl´adac´ıch prvk˚ua standardu [1, 27].

2.3 GUI

GUI je zkratka z anglick´ehoGraphical User Interface, ˇceskygrafick´euˇzivatelsk´e rozhran´ı.Toto rozhran´ıumoˇzˇnujelidem interagovat a komunikovat s poˇc´ıtaˇcia dalˇs´ımizaˇr´ızen´ımi,v dneˇsn´ıdobˇenapˇr´ıklads mobiln´ımitelefony. K tomu GUI vyuˇz´ıv´agrafick´ych moˇznost´ızaˇr´ızen´ıpro zjednoduˇsen´ıkomunikace zakryt´ım detail˚uprogramovac´ıhojazyka uˇzivateli. GUI vyuˇz´ıv´ar˚uzn´ych prvk˚u– okna, ikony, nab´ıdky, tlaˇc´ıtka,dialogy a dalˇs´ıprvky – jako prostˇredn´ıkypro komunikaci mezi uˇzivatelem a poˇc´ıtaˇcem. Tˇemto prvk˚umse tak´eˇr´ık´a widgety“. Uˇzivatel je obvykle aktivuje nebo ” s nimi manipuluje pomoc´ımyˇsinebo jin´ymukazov´atkem (napˇr.dotykem na dotykov´emdispleji). Pro zjednoduˇsen´ınˇekter´ych ˇcast´ych operac´ım˚uˇzeb´yt vyuˇzitokl´avesov´ych zkratek. GUI je vˇetˇsinouˇr´ızenopomoc´ıud´alost´ı,jak´ykoliv ´ukol je tedy zpracov´an na z´akladˇevygenerovan´ea detekovan´eud´alosti,kterou mohl (ale nemusel) spustit uˇzivatel. K uloˇzen´ırozepsan´ehotextu tak m˚uˇzedoj´ıtautomaticky na z´akladˇeˇcasovaˇce,stisknut´ımkl´avesov´ych zkratek uˇzivatelem a nebo pomoc´ı akce uloˇzen´ıv menu aplikace. V pˇr´ıpadˇev´ystupu (napˇr.otevˇren´ıdialogu) je v´ystupzobrazen uˇzivateli na obrazovku. Pro porovn´an´ıje v pˇr´ıpadˇeCLI – z anglick´ehoCommand Line Interface, ˇceskyrozhran´ıpˇr´ıkazov´eˇr´adky– uˇzivateli prezentov´anapr´azdn´aobrazovka a pˇr´ıkazov´yˇr´adek.Komunikace se zaˇr´ızen´ımprob´ıh´apomoc´ıpˇr´ıkazov´eˇr´adky, kam uˇzivatel zad´av´apˇr´ıkazy. Pˇr´ıkazov´aˇr´adkapˇredpokl´ad´auˇzivatelovu znalost programovac´ıhojazyka a interpretuje zadan´ypˇr´ıkazjako ´ukol. V minulosti byl takto realizov´annapˇr. operaˇcn´ı syst´emMS-DOS. Pˇr´ıkazov´aˇr´adkaje v souˇcasn´edobˇest´alev operaˇcn´ıch syst´emech dostupn´a,nicm´enˇeje obvykle zakryt´agrafick´ymprostˇred´ım[2].

2.3.1 Komponenty GUI V´ysledn´yv´ystupgrafick´ehouˇzivatelsk´ehorozhran´ız´aleˇz´ına operaˇcn´ımsyst´emu, platformˇea ´uˇceluGUI. VˇetˇsinaGUI m´aale podobn´ekomponenty, jak pops´ano v [2]:

6 2.3. GUI

• Okna jsou jedn´ımz hlavn´ıch grafick´ych mechanism˚upouˇz´ıvan´ych ke seskupov´an´ıa izolov´an´ıfunkc´ısoftwaru zaloˇzen´eho na grafick´emuˇziva- telsk´emrozhran´ı.Okno rozdˇel´ıobrazovku na oddˇelen´eoblasti, kde m˚uˇze uˇzivatel spustit jin´yprogram, zobrazit adres´aˇre,zobrazit jin´ygraf atd.

• Desktop je hlavn´ıoblast´ıve vˇetˇsinˇeoperaˇcn´ıch syst´em˚u,tak´enaz´yvan´y plochou. Dalo by se to povaˇzovat za hlavn´ıokno, kde se obvykle zobrazuj´ı ikony.

• Ikony jsou grafikou nebo obr´azky, kter´epˇredstavuj´ı´ukoly, programy, sloˇzky, soubory, okna a dalˇs´ı.Zjednoduˇsuj´ıtak oznaˇcen´ıakce, kter´aje po nimi skryt´a.Obvykle jsou uspoˇr´ad´any na ploˇse,na panelech n´astroj˚u, v adres´aˇr´ıch a nab´ıdk´ach. Hlavn´ım´uˇcelemikon je sdˇelituˇzivateli uˇziteˇcn´e informace o ´ukolu, kter´yse vyvol´akliknut´ımna ikonu.

• Ukazovac´ı zaˇr´ızen´ı – jedn´ase obvykle o myˇs,trackball nebo dotykovou podloˇzku. Polohovac´ızaˇr´ızen´ıpohybuje kurzorem na obrazovce. Umoˇzˇnuje uˇzivateli vybrat objekty na obrazovce a klepnut´ımaktivovat komponenty uˇzivatelsk´ehorozhran´ı,pˇret´ahnoutsoubory nebo objekty, zmˇenitvelikost oken atd. D˚uleˇzitoufunkc´ı,kter´eumoˇzˇnujegrafick´erozhran´ı,je naznaˇcen´ı moˇznostiakce pod tlaˇc´ıtkem ˇciikonou, po najet´ıkurzorem, pomoc´ıjeho zmˇeny.

• Nab´ıdka pˇr´ıpadnˇemenu se pouˇz´ıv´ave velk´evˇetˇsinˇeprogram˚u,kter´e maj´ıgrafick´erozhran´ı.Nab´ız´ıseznam dostupn´ych moˇznost´ı,ze kter´ych si uˇzivatel m˚uˇze vybrat. Castoˇ jsou tyto akce kombinov´any se zkratkami zadan´ych pomoc´ıkl´avesnice.

• Zrychlen´a nab´ıdka – tento typ nab´ıdkyse aktivuje kliknut´ımprav´ym tlaˇc´ıtkem myˇsi.Objev´ıse r˚uzn´enab´ıdkya moˇznostiv z´avislostina oblasti, kde ke kliknut´ıdoch´az´ı.Komponenta je tedy sv´az´anas kontextem, tak´e oznaˇcov´anajako kontextov´anab´ıdka.

• Rozbalovac´ı seznam se pouˇz´ıv´av pˇr´ıpadˇev´ybˇeruz velk´ehomnoˇzstv´ı moˇznost´ı.Ty obvykle zobrazuj´ıaktu´aln´ıhodnotu pro uˇzivatelsk´erozhran´ı a maj´ıˇsipkusmˇeˇruj´ıc´ıdol˚u,coˇznaznaˇcuje,ˇzeje k dispozici v´ıcemoˇznost´ı. Uˇzivatel m˚uˇzekliknut´ımna ˇsipkuzobrazit nab´ıdkunebo seznam dalˇs´ıch moˇznost´ı.Nˇekter´enab´ıdkynab´ızej´ıvyhled´av´an´ıˇcifiltrov´an´ımoˇznost´ı pomoc´ıpsan´ıdo nab´ıdky.

• Dialogov´a okna nebo vyskakovac´ı okna – od tˇech, kter´eposkytuj´ı pouze informace, po ty, kter´euˇzivatele poˇz´adaj´ıo zad´an´ınˇeˇcehonebo o v´ybˇer.Jedn´ımpˇr´ıklademdialogov´ehookna je okno, ve kter´emm´a uˇzivatel moˇznostvybrat soubor jako pˇr´ılohu, vyskakuj´ıc´ıokno m˚uˇzeb´yt jak´akoliv chybov´ahl´aˇska,kterou je tˇrebazobrazit uˇzivateli.

7 2. Teoreticka´ cˇast´

• Tlaˇc´ıtka jsou pouˇzit´ev pˇr´ıpadˇe,kdy v´yvoj´aˇrchce uˇzivateli poskytnout diskr´etn´ımoˇznosti,kde po stisknut´ıtlaˇc´ıtkadojde k nˇejak´eakci okamˇzitˇe. M˚uˇzeexistovat nˇekolik tlaˇc´ıteknab´ızej´ıc´ıch celou ˇradumoˇznost´ı,kdy by mˇelob´ytv´ychoz´ıtlaˇc´ıtko zv´yraznˇeno(napˇr.potvrzen´ıformul´aˇre).Ve formul´aˇr´ıch m˚uˇzeuˇzivatel m´ıstokliknut´ına tlaˇc´ıtko stisknout kl´avesu Return; v takov´empˇr´ıpadˇese zv´yraznˇen´amoˇznostprovede.

• Pˇrep´ınaˇce a zaˇskrt´avac´ı pol´ıˇcka jsou podobn´atlaˇc´ıtk˚umv tom, ˇze nab´ızej´ıuˇzivateli zp˚usoby v´ybˇeruz kr´atk´eho seznamu moˇznost´ı.Pˇrep´ınaˇce a zaˇskrt´avac´ıpol´ıˇckajsou obvykle seskupeny a definov´any tak, aby se moˇznostivz´ajemnˇevyluˇcovaly. Jin´ymislovy, uˇzivatel m˚uˇzeprov´estpouze jeden v´ybˇer.

• Textov´a pole nebo textov´eoblasti, umoˇzˇnuj´ıuˇzivateli zapsat text. Ve formul´aˇr´ıch jsou uˇziteˇcn´e, kdyˇzm´auˇzivatel nekoneˇcn´emnoˇzstv´ımoˇznost´ı. Pˇr´ıklademtohoto typu rozhran´ıje pole adresy URL ve vˇetˇsinˇeprohl´ıˇzeˇc˚u.

2.3.2 Interakce Navrhov´an´ıvizu´aln´ıkompozice a chov´an´ıgrafick´ehouˇzivatelsk´ehorozhran´ı je d˚uleˇzitousouˇc´ast´ıprogramov´an´ısoftwarov´ych aplikac´ıv oblasti interakce ˇclovˇeka s poˇc´ıtaˇcem.Jeho c´ılemje zv´yˇsitefektivitu a snadnost pouˇzit´ıpro z´akladn´ılogick´ydesign uloˇzen´ehoprogramu, designovou discipl´ınu nazvanou pouˇzitelnost.Pouˇz´ıvaj´ıse metody designu zamˇeˇren´ena uˇzivatele, aby bylo zajiˇstˇeno,ˇzevizu´aln´ıjazyk zaveden´yv n´avrhu je dobˇrepˇrizp˚usoben ´ukol˚um. Zaˇr´ızen´ılidsk´ehorozhran´ı(anglick´azkratka HID) je poˇc´ıtaˇcov´ezaˇr´ızen´ı, kter´eje obvykle pouˇz´ıv´an´ılidmi a kter´epˇrij´ım´avstup od lid´ıa poskytuje v´ystuplidem. Pro efektivn´ı interakci s grafick´ymuˇzivatelsk´ymrozhran´ım HID pro vstup zahrnuj´ıpoˇc´ıtaˇcovou kl´avesnici, zejm´enapouˇz´ıvanou spoleˇcnˇe s kl´avesov´ymizkratkami, ukazovac´ızaˇr´ızen´ıpro ovl´ad´an´ıkurzoru (nebo sp´ıˇse ukazatele): myˇs,ukazov´atko, touchpad, trackball, joystick. Vstupem m˚uˇzeb´yti mikrofon pro hlasov´eovl´ad´an´ı.Pro v´ystupjsou pouˇzit´eobrazovky, reproduktory a pˇr´ıpadnˇevibrace, ovlivˇnuj´ıc´ılidsk´yhmat.[3]

2.3.3 Sada n´astroj˚u Sada n´astroj˚u,neboli , je knihovna grafick´ych komponent˚u (widget˚u),ze kter´ych je GUI vytv´aˇreno.Nˇekolik z tˇechto sad lze pouˇz´ıtv r˚uzn´ych programovac´ıch jazyc´ıch, pokud jsou pro nˇenaps´any bal´ıˇckys vazbami pro dan´ytoolkit, jako je tomu v pˇr´ıpadˇeframeworku Qt v C++ a bal´ıˇckuPyQt pro Python. Vzhled a chov´an´ıgrafick´ych ovl´adac´ıch prvk˚ulze oddˇelit,coˇzumoˇzˇnuje modifikaci grafick´ych ovl´adac´ıch prvk˚u.GUI programu je obvykle konstruov´ano kask´adovitˇe,pˇriˇcemˇzgrafick´eovl´adac´ıprvky jsou pˇrid´av´any pˇr´ımona sebe. S konstrukc´ımohou pomoci vhodn´eeditory pro dan´ytoolkit, kter´eje moˇzn´e

8 2.3. GUI pouˇz´ıt WYSIWYG zp˚usobem s vyuˇzit´ım znaˇckovac´ıho jazyka. Vytvoˇren´y zdrojov´ysoubor se znaˇckov´ymjazykem pak m˚uˇzeb´ytnaˇctenpˇrikonstrukci GUI v samotn´emprogramu.[4] Vˇetˇsina sad n´astroj˚upro widgety pouˇz´ıv´aprogramov´an´ı zaloˇzen´ena ud´alostech jako model interakce. Sada n´astroj˚uzpracov´av´auˇzivatelsk´eud´alosti, napˇr´ıkladkdyˇzuˇzivatel klikne na tlaˇc´ıtko. Kdyˇzje zjiˇstˇenaud´alost,je pˇred´ana aplikaci, kde je ud´alostˇreˇsena.[5] N´ıˇzeuv´ad´ımnˇekolik pˇr´ıklad˚utoolkit˚us jejich moˇzn´ymˇrazen´ımdle [4]:

• Integrovan´ev operaˇcn´ıch syst´emech

– Cocoa (OS X) – Windows API ( Windows - do roku 2006)

• Oddˇelen´avrstva nad operaˇcn´ımsyst´emem

– X Window syst´ems Xt widgety, pouˇz´ıv´anotoolkity OLIT, , Xaw ∗ X Window syst´emje okenn´ısyst´empro bitmapov´edisplaye, ˇcast´yv syst´emech zaloˇzen´ych na Unixu. ∗ Periferie komunikuj´ı s X serverem, aplikace jsou pˇripojeny k serveru jako X klienti.

• Z´avisl´ena operaˇcn´ımsyst´emu

– BOOPSI, MUI, ReAction, – Mackintosh – Cocoa, MacApp, PowerPlant – – MFC (obalen´ıWindows API v C++), WTL, QWL, VCL, , Windows Presentation Foundation – – LessTif, MoOLIT, Motif, OLIT, Xaw, XView

• Multiplatformn´ı– vˇzdyvych´az´ız nˇejak´eexistuj´ıc´ıtechnologie, progra- movac´ıhojazyka:

– C – Elementary, GTK+, IUP, Tk, XForms, XVT – C++ – CEGUI, FLTK, FOX, GLUI, , Juce, Qt, wxWidgets – OpenGL – Clutter – Flash – , Adobe Flex – Go – Fyne – XML – GladeXML, XAML, XUL – JavaScript – Cappuccino, jQuery Ui, React, – SVG – Rapha¨el

9 2. Teoreticka´ cˇast´

– C# – Gtk#, QtSharp, WindowsForms – Java - , , Apache Pivot, JavaFX/- FXML, – FireMonkey, IP Pascal, LCL, fpGUI, CLX – Objective-C – GNUstep, Cocoa – Ruby – Shoes

2.4 Tkinter

Tkinter je standardizovan´ybal´ıˇcekpro programov´an´ıGUI pomoc´ıTk toolkitem v Pythonu. Byl vytvoˇrenSteen Lumholtem a Guido van Rossumem. Jak Tk i Tkinter jsou dostupn´ena vˇetˇsinˇeUnixov´ych platform´ach, stejnˇetak na Windowsov´ych syst´emech. Samotn´eTk nen´ısouˇc´ast´ıPythonu. Tkinter kromˇesamotn´ehomapov´an´ına Tk objekty nab´ız´ıtak´edalˇs´ımoduly. Nejd˚uleˇzitˇejˇs´ız nich je modul tkinter.constants, kter´yobsahuje konstanty pouˇz´ıvan´ev Tkinteru. Tkinter si jej vˇsakimportuje samostatnˇe.Hlavn´ıtˇr´ıda Tk lze vytvoˇritbez argument˚u– je obvykle hlavn´ımoknem aplikace. Kaˇzd´a instance m´avlastn´ıpˇridruˇzen´yinterpret Tcl. Mezi dalˇs´ımoduly, kter´etkinter nab´ız´ı,patˇr´ı:

• tkinter.colorchooser – Dialog umoˇzˇnuj´ıc´ıuˇzivateli vybrat barvu.

• tkinter.commondialog – Z´akladn´ıtˇr´ıdapro dialogy definovan´ev dalˇs´ıch zde uveden´ych modulech.

• tkinter.filedialog – Bˇeˇzn´edialogy umoˇzˇnuj´ıc´ıuˇzivateli urˇcitsoubor, kter´yse m´aotevˇr´ıtnebo uloˇzit.

• tkinter.font – Obsluˇzn´eprogramy usnadˇnuj´ıc´ıpr´acis p´ısmy.

• tkinter.messagebox – Pˇr´ıstupke standardn´ımdialogov´ymokn˚umTk.

• tkinter.scrolledtext – Textov´ywidget se zabudovan´ymvertik´aln´ım posuvn´ıkem.

• tkinter.simpledialog – Z´akladn´ıdialogy a praktick´efunkce.

• tkinter.dnd – Podpora pˇretaˇzen´ı(drag and drop). Experiment´aln´ı– mˇeloby se st´atzastaral´ym,aˇzbude nahrazeno Tk DND.

• turtle – Turtle grafika v oknˇeTk.

Tkinter je moˇzn´eimportovat v Pythonu jako bal´ıˇcekze standardn´ıknihovny. Tento bal´ıˇcekje napsan´yv Pythonu. Pˇrivol´an´ırozdˇel´ıpˇr´ıkazya argumenty

10 2.4. Tkinter pˇr´ıkazua konvertuje je do podoby, kter´aodpov´ıd´aformˇepro Tk. Tyto zpraco- van´adata poˇsledo modulu tkinter, napsan´emCPythonu. Funkce v progra- movac´ımjazyce C m˚uˇzed´alevolat ostatn´ımoduly v C, tud´ıˇzi funkce pro Tk v C. Ty jsou implementov´any v C a v Tcl, kter´eTk widget˚upˇriˇrazujeurˇcit´e v´ychoz´ıchov´an´ı.Tk v jazyce C d´aleimplementuje mapov´an´ıdo , knihovny, kter´aobsahuje funkce pro komunikaci s X serverem.[6]

2.4.1 Tcl/Tk Tcl Tcl je jednoduch´yprogramovac´ıjazyk, obsahuj´ıc´ıvˇsechny obvykl´esouˇc´asti programovac´ıhojazyka. Tcl skripty jsou tvoˇreny pˇr´ıkazyoddˇelen´ych pomoc´ı stˇredn´ık˚unebo odˇr´adkov´an´ı.Pˇr´ıkazyjsou sloˇzeny ze slov oddˇelen´ych pomoc´ı mezer. V Tcl je moˇzn´edefinovat promˇenn´e,podpˇr´ıkazy, ˇretˇezcea dalˇs´ı.Bˇeh programu je moˇzn´eˇr´ıditpomoc´ıobvykl´ych ˇr´ıd´ıc´ıch struktur – if, switch, for, while a dalˇs´ıch. D´aleumoˇzˇnujemanipulaci se soubory, I/O operace, pr´acis ˇcasema ud´alosti.Obsahuje tak´estruktury jako jsou listy a pole.[7] Jazyk Tcl byl navrˇzenjako flexibiln´ıjazyk s mal´ymj´adrem,jednoduˇse upraviteln´y,d´ıkyˇcemuˇzbyl pouˇz´ıv´annapˇr´ıklad v Cisco routerech. Vyuˇzit´ı jazyka je nˇekolik:

• Webov´eaplikace – D´ıkys´ıt’ov´ymmoˇznostemumoˇzˇnujetvorbu webov´ych aplikac´ı. V Tcl byl vytvoˇrenweb server AOLServer, kter´ynab´ızel i komerˇcn´ıˇreˇsen´ı.

• Tvorba aplikac´ıs GUI – Widget toolkit Tk rozˇs´ıˇr´ıpopularitu Tcl poskyt- nut´ım rozhran´ıpro jednoduch´epsan´ıaplikac´ıs grafick´ymrozhran´ımpod Unixem a X11.

• Testov´an´ı– Tcl pˇrich´az´ıs testovac´ımframeworkem tcltest, na kter´em jsou postaveny dalˇs´ıtestovac´ıframeworky (napˇr. DejaGnu).

• Datab´aze– Tcl poskytuje rozhran´ıpro pˇripojen´ıdo SQL datab´aze,pomoc´ı TDBC. Nab´ız´ıovladaˇcepro datab´aze SQLite, MySQL, PostgreSQL a dalˇs´ı.

• V´yvoj vestavˇen´ych ˇreˇsen´ı– Tcl je velmi kompaktn´ıjazyk a je tak snadno integrovateln´yse speci´aln´ımhardware, m˚uˇzetak b´ytvolbou pro vestavˇen´y v´yvoj.[8]

Tk Tk je platformnˇenez´avislousadou n´astroj˚uvytvoˇrenoupro Tcl. Tk widgety jsou vysoce modifikovateln´e,a to jak pˇrivytvoˇren´ıwidgetu, tak i v dobˇejeho existence, pomoc´ıvol´an´ıkonfiguraˇcn´ıch pˇr´ıkaz˚u.Dalˇs´ıfunkce je moˇzn´epˇrid´avat pomoc´ıpˇr´ıkaz˚u,kter´eje moˇzn´euloˇzita pozdˇejivolat. Existuje nˇekolik jazyk˚u, pro kter´eexistuj´ıbal´ıˇckypro vyuˇzit´ıTk widget˚u.

11 2. Teoreticka´ cˇast´

Pˇr´ıkazyTk pro Tcl maj´ıvˇzdypevnˇedanou strukturu. Pokud je widget vytv´aˇren,skl´ad´ase z tˇechto ˇc´ast´ı– classCommand newPathname options, postupnˇe:

1. classCommand – Z´adan´atˇr´ıdawidgetu,ˇ napˇr´ıklad button, tedy tlaˇc´ıtko.

2. newPathname – N´azevdan´einstance widgetu, napˇr. button1.

3. options – Nastaven´ıvlastnost´ıwidgetu, vˇzdypo dvojic´ıch n´azevvlast- nosti a hodnota, ve form´atu -n´azev hodnota, tedy napˇr´ıklad -fg red -text "Hello world!". T´ımto nastaven´ımbychom doc´ılilivykreslen´ı ˇcerven´ehotextu obsahuj´ıc´ızpr´avu Hello world!“ na zadan´emtlaˇc´ıtku. ” Pokud je widget jiˇzvytvoˇren,je moˇzn´eho mˇenitpomoc´ıpˇr´ıkazusloˇzen´eho z n´asleduj´ıc´ıch ˇc´ast´ı– .button1 someAction someOptions, postupnˇe:

1. .button1 – Jm´enoinstance widgetu, kterou konfigurujeme, uvozen´e teˇckou (pouˇzitainstance tlaˇc´ıtkaz uk´azkyzaloˇzen´ıwidgetu).

2. someAction – Akce, kter´am´ab´ytaplikov´anana instanci widgetu. Hod- noty tohoto parametru pˇr´ıkazuz´aleˇz´ına dan´etˇr´ıdˇe,jej´ıˇzinstanc´ıje widget.

3. someOptions – Argumenty akce aplikovan´ena instanci. Nˇekter´eakce nepotˇrebuj´ıˇz´adn´eargumenty, jin´emohou m´ıtv´ıceargument˚u.[6]

2.5 PyQt, PySide

Pro pouˇzit´ıtoolkitu Qt se nejˇcastˇejiv Pythonu pouˇz´ıvaj´ıbal´ıˇckyPyQt nebo PySide. Oba bal´ıˇckymaj´ıvazby do Qt frameworku, kaˇzd´yz nich ale vyuˇz´ıv´a jin´ygener´atorvazeb.

2.5.1 Qt Qt je multiplatformn´ıtoolkit, kter´yumoˇzˇnujevytvoˇren´ıaplikac´ıpro Windows, Mac OS X, a dalˇs´ısyst´emy zaloˇzen´ena Unixu. Velk´aˇc´astQt toolkitu je vˇenov´anavytvoˇren´ıplatformnˇeneutr´aln´ımu rozhran´ıpro grafick´eprvky. Qt je licencov´anodu´alnˇe,komerˇcn´ılicenc´ıpro komerˇcn´ıv´yvoj a open source licenc´ı– GPL a za urˇcit´ych podm´ınekLGPL licenc´ı[9]. Qt bylo p˚uvodnˇevyvinuto pro C a C++, existuj´ıvˇsakvazby pro mnoho dalˇs´ıch jazyk˚u.Trolltech, spoleˇcnost,kter´aQt vytvoˇrila,poskytuje ofici´aln´ı vazby pro C++, Javu a JavaScript. Tˇret´ıstrany poskytuj´ıvazby pro dalˇs´ı jazyky, jako je pr´avˇePython, ale i Ruby, PHP a .NET. Qt pˇrin´aˇs´ıdo C++ sign´alya sloty, kter´eumoˇzˇnuj´ıpropojen´ıobjekt˚u,zat´ımco usnadˇnuj´ın´avrha zvyˇsuj´ıopˇetovn´epouˇzit´ık´odu.Sign´alje metoda, kter´aje m´ıstovol´an´ıemitov´ana.Z pohledu program´atorajde sp´ıˇsedeklarac´ıprototyp˚u

12 2.5. PyQt, PySide sign´al˚u,kter´eby mohly b´ytemitov´any. Naopak slot je funkce, kter´aje vol´ana jako d˚usledekemitov´an´ısign´alu.Je moˇzn´epˇripojit libovoln´ypoˇcetsign´al˚una libovoln´ypoˇcetslot˚u.Kdyˇzje vys´ıl´ansign´al,vˇsechny sloty s n´ımspojen´ejsou vyvol´any – poˇrad´ınen´ıdefinov´ano.[10] Qt je v´ıceneˇzsada n´astroj˚u,zahrnuje tak´eabstrakce s´ıt’ov´ych soket˚u,pod- proces˚u,, regul´arn´ıch v´yraz˚u,datab´az´ıSQL, SVG, OpenGL, XML, plnˇe funkˇcn´ıwebov´yprohl´ıˇzeˇc,syst´emn´apovˇedy, multimedi´aln´ır´ameca bohatou sb´ırkuwidget˚uGUI.[11]

2.5.2 PyQt PyQt je bal´ıˇcek, mnoˇzinavazeb pro framework Qt. Vazby jsou implementov´any jako moduly pro Python. PyQt je podporov´anona vˇsech platform´ach, na kter´ych je podporov´anoQt. Licence PyQt je du´aln´ı,a to licenc´ıGNU GPL verze 3 a licenc´ıRiverbank Commercial License, kter´aje urˇcenapro komerˇcn´ıpouˇzit´ı. Pro Qt existuje program Qt Designer pro n´avrhgrafick´eho uˇzivatelsk´eho rozhran´ı.N´avrh je uloˇzendo souboru, ze kter´ehoPyQt umoˇzˇnujevygenerovat zdrojov´yk´odpro Python. PyQt kombinuje v´yhody Qt a Pythonu, umoˇzˇnujetedy uˇzivateli vyuˇz´ıt Qt v pln´es´ılepomoc´ıjednoduchosti Pythonu.[11] Bal´ıˇcekPyQt je sestaven pomoc´ıgener´atoruvazeb SIP. Tento gener´ator vazeb byl p˚uvodnˇevytvoˇren pouze pro PyQt, ale m˚uˇzeb´ytpouˇzitpro jak´ekoliv jin´eC a C++ knihovny. Je pouˇzitnapˇr´ıkladi pro wxPython toolkit.[12]

2.5.3 PySide PySide je bal´ıˇcekvazeb Pythonu na framework Qt, kter´yposkytuje pˇr´ıstup k ´upln´emu r´amciQt a tak´ek n´astroj˚umgener´atorupro rychl´egenerov´an´ı vazeb pro vˇsechny knihovny C++. Projekt PySide je vyv´ıjenjako open source se vˇsemifunkcemi, kter´ebyste oˇcek´avali od jak´ehokoli modern´ıhoprojektu otevˇren´ehosoftware, jako je veˇsker´yk´odv ´uloˇziˇstigit, otevˇren´yprostor pro hl´aˇsen´ıchyb a otevˇren´yproces n´avrhu.[13] PySide je sestaven pomoc´ı gener´atoruvazeb Shiboken. Ten extrahuje vˇsechny informace z hlaviˇckov´ych soubor˚uC/C++ a generuje zdrojov´ysoubor v CPythonu, kter´yumoˇzˇnujevyuˇz´ıvat C/C++ projekty v Pythonu. Pˇritom vyuˇz´ıv´aknihovnu ApiExtractor, kter´yvnitˇrnˇevyuˇz´ıv´aClang. Shiboken d´ale slouˇz´ıjako Pythonn´ımodul napsan´yv CPythonu, kter´yvystavuje nov´etypy, funkce a dalˇs´ıv Pythonu.[14]

2.5.4 Rozd´ılyPyQt a PySide Rozd´ılymezi PyQt a PySide m˚uˇzemehledat ve tˇrech ´urovn´ıch – z hlediska rozd´ıln´ehorozhran´ı,syntaxe a funkcionality vazeb na Qt.

13 2. Teoreticka´ cˇast´

Rozhran´ı PySide podporuje pouze PyQt API 2“. API 2 poskytuje automa- ” tickou konverzi mezi tˇr´ıdamiv Qt a odpov´ıdaj´ıc´ımdatov´ymtypem ˇcitˇr´ıdou v Pythonu. API 1“ spoˇc´ıv´av poskytnut´ıtyp˚ujako je QString, QVariants ” a dalˇs´ı,jako je tomu v Pythonu. Pouˇzit´eAPI je moˇzn´ezmˇenit,vy v´ychoz´ım stavu je API 1 pouˇz´ıv´ano v Pythonu 2, API 2 je ve v´ychoz´ımstavu pouˇzito v Pythonu 3. V PySide je tak nutn´epouˇz´ıtnativn´ıPython datov´etypy.

Syntaxe Nov´ystyl sign´al˚ua slot˚uPyQt vyuˇz´ıv´an´azvymetod a dekor´ator˚u specifick´epro jejich prov´adˇen´ı.PySide tak vyuˇz´ıv´a QtCore.Signal, respektive QtCore.Slot m´ısto QtCore.pyqtSignal, respektive QtCore.pyqtSlot. Po- dobnˇetomu je pro vlastnosti z QtCore.Property, pro kter´em´aPyQt um´ıstˇen´ı QtCore.pyqtProperty. Rozd´ıln´en´azvymaj´ıtak´ebal´ıˇckys n´astroji.

Funkcionality Funkce, kter´ebyly zastaral´epˇredQt verze 4.5 nejsou pro PySide vygenerovan´e.PySide nem˚uˇzespr´avnˇevyuˇz´ıtfunkce sender() pro z´ısk´an´ıodes´ılatelesign´alu,pokud je jako slot pouˇzita lambda. PySide tak´e oˇcek´av´a,ˇzepˇri dˇedˇen´ıbude vol´anpˇr´ım´ykonstruktor rodiˇce.[15] Existuj´ıprojekty, jako je napˇr´ıklad QtPy, kter´etyto rozd´ılyzabaluj´ıpˇres spoleˇcn´erozhran´ıa vykon´avaj´ıc´ıbal´ıˇcekje zvolen podle dostupnosti nebo podle uˇzivatelova nastaven´ı[16].

2.6 Srovn´an´ı

V t´etoˇc´astise pokus´ımshrnout a tak porovnat Tkinter, PyQt a PySide. V nˇekter´ych krit´eri´ıch nebudu uvaˇzovat PySide, jelikoˇznen´ıpˇr´ıliˇsrozd´ıln´y,jak jsem uvedl v pˇredchoz´ıˇc´asti2.5.4. Tkinter i PyQt jsou uˇziteˇcn´epˇriv´yvoji grafick´ych uˇzivatelsk´ych rozhran´ı, ale z´aroveˇnse liˇs´ız hlediska pˇrizp˚usobivosti a funkˇcnosti.Zat´ımcov Tkinteru m´av´yvoj´aˇrmoˇznost samostatn´ehovyv´ıjen´ıGUI, programov´an´ısv´ych nastaven´ı nebo definov´an´ıfunkc´ıve stejn´emskriptu, v PyQt je obvykl´eoddˇelen´ıgrafick´eho uˇzivatelsk´ehorozhran´ıve skriptu, kter´ypouˇz´ıv´afunkcionality z jin´ehoskriptu pro Python. M´ıstovytv´aˇren´ıvlastn´ıhok´odupro uˇzivatelsk´erozhran´ıv PyQt je moˇzn´e vyuˇz´ıtQt Designer pro n´avrhrozhran´ı.V´ystupn´ısoubor z Qt Designeru je moˇzn´erovnˇeˇzzpracovat v PySide, pomoc´ıpodobn´eknihovny. Pro Tkinter tak´e existuj´ıprogramy pro n´avrhrozhran´ı,jako je program PyGubu. Jeho pouˇzit´ı je vˇsakn´aroˇcnˇejˇs´ı,neˇzjeho ekvivalent pro Qt. Tkinter je souˇc´ast´ıPythonu a pro jeho komerˇcn´ıvyuˇzit´ınen´ıdefinov´ana rozd´ıln´alicence (PSFL licence). Stejnˇetak Tcl a Tk jsou licencov´any jako opensource, zdarma, bez nutnosti uv´adˇetsv˚ujzdrojov´yk´od[17]. Qt je vˇsak licencov´anodu´alnˇe,pro komerˇcn´ıvyuˇzit´ı,kde nen´ıvhodn´euv´adˇetzdrojov´y k´od,je nutn´ezakoupit komerˇcn´ılicenci. To sam´eplat´ıpro du´aln´ılicencov´an´ı PyQt. PySide je licencov´anlicenc´ıLGPL verze 2.1.

14 2.7. Motivace

D´ıkytomu, ˇzeTkinter je souˇc´ast´ıPythonu jako vlastn´ıknihovna, nen´ı tˇrebaˇz´adn´ainstalace dalˇs´ıch bal´ıˇck˚ua z´avislost´ı.Nev´yhodou t´etodistribuce je nutnost vydat novou verzi Pythonu pro zpˇr´ıstupnˇen´ızmˇenv Tkinteru. Tkinter m´apomˇernˇejednoduch´eAPI, kter´em´asv´elimitace. Na rozd´ılod PyQt nem´a pokroˇcil´ewidgety, ty jsou z ˇc´astidoplnˇeny pomoc´ırozˇs´ıˇren´ı ttk. PyQt ˇciPySide jsou samostatn´ymibal´ıˇcky. Qt tˇemto bal´ıˇck˚umpˇrin´aˇs´ı funkcionalitu sign´al˚ua slot˚uk propojen´ı komunikace mezi objekty, kter´a umoˇzˇnujedekompozici k´odua urˇcitoum´ıruflexibility pˇrizpracov´an´ıud´alost´ı v grafick´em uˇzivatelsk´emrozhran´ı. Zaˇc´ıtvytv´aˇretgrafick´euˇzivatelsk´erozhran´ıv Tkinteru je jednoduˇsˇs´ıd´ıky jeho jednoduch´emu API. Na druhou stranu ˇsirok´emnoˇzstv´ımoˇznost´ıv PyQt je vhodn´epro tvorbu vˇetˇs´ıch aplikac´ı,vyˇzadujeale od uˇzivatele vyˇsˇs´ım´ıru pochopen´ı funkc´ı PyQt. Nav´ıc pro PyQt chyb´ı dokumentace pro Python. Dokumentace PyQt vˇetˇsinouodkazuje na dokumentaci zdrojov´ych tˇr´ıdv C++. Dokumentace pro PySide vˇsakpokr´yv´ai specifick´eˇc´astipro Python, a vzhledem k tomu, ˇzemezi PyQt a PySide nen´ıpˇr´ıliˇsrozd´ıl˚u,je moˇzn´eji vyuˇz´ıti pro v´yvoj s vyuˇzit´ımPyQt.

2.7 Motivace

Zdrojem motivace ke zpracov´an´ıtohoto t´ematuje nˇekolik. Jako prvn´ım˚uˇzeb´yt podoba Tkinteru, kter´yje ˇcastoza nehezk´y,oˇskliv´y,a tˇeˇzcese nastavuje tak, aby vypadal dle odpov´ıdaj´ıc´ıplatformy. Abych pojem oˇskliv´y“ uvedl korektnˇe, ” Tkinter se sice snaˇz´ıpouˇz´ıvat nativn´ıkomponenty, pokud je to moˇzn´e(tak´eza pomoci modulu ttk, viz. 3.1.4), rozd´ılje v integraci s c´ılovou platformou. Qt je vˇzdynativn´ı. Hlavn´ıd˚uvod je vˇsaksloˇzitˇejˇs´ı.Jiˇzv dˇr´ıvˇejˇs´ıkapitole (2.3.3) jsem psal o X Window Syst´emu (tak´ejen X“). Pot´e,co bylo umoˇznˇenom´ıt v´ıceproces˚u ” pro uˇzivatelsk´erozhran´ı,dalˇs´ımtechnick´ymprobl´emem,kter´yje tˇrebavyˇreˇsit, je z´ısk´an´ıv´ystup˚ukaˇzd´ehoz proces˚una displej. Historicky se pˇristupovalo k pouˇz´ıv´an´ıX a psan´ısv´ehovlastn´ıhospr´avce oken. Spr´avce obrazovky X je dnes nahrazov´anWaylandem. Ten je jednoduˇsˇs´ına spr´avua rozˇs´ıˇren´ı.Je modern´ımpˇr´ıstupem ke spr´avˇeoken v souvislosti v dneˇsn´ımhardwarem.[18]

Rozd´ıly Mezi Waylandem a X je dle [19] nˇekolik rozd´ıl˚u:

• Architektura – Spr´avce skladby (z´asobn´ıkoken mimo obrazovku) je v X samostatn´a,pˇridan´afunkce. Wayland spojuje zobrazovac´ıserver a spr´avce skladby jako jednu funkci. Wayland tak´ezahrnuje nˇekter´ez ´ukol˚u spr´avce oken, coˇzje v X samostatn´yproces na stranˇeklienta.

• Kompozice – Kompozice je v X voliteln´a,ale v Waylandu povinn´a. Kompozice v X je ”aktivn´ı”;to znamen´a,ˇzespr´avce skladby mus´ınaˇc´ıst vˇsechna pixelov´adata, d´ıkyˇcemuˇzdoch´az´ık latenci. U Waylandu je

15 2. Teoreticka´ cˇast´

kompozice pasivn´ı“,coˇzznamen´aˇzespr´avce skladby pˇrij´ım´apixelov´a ” data pˇr´ımood klient˚u.

• Vykreslov´an´ı – Samotn´yserver X je schopen prov´adˇetvykreslov´an´ı, pokyn k vykreslen´ımu tak´em˚uˇzeb´ytodesl´anklientem. Naproti tomu Wayland nevystavuje ˇz´adn´erozhran´ıAPI pro vykreslov´an´ı,ale dele- guje takov´e´ukoly na klienty (vˇcetnˇevykreslov´an´ıp´ısem,widget˚uatd.). Dekor´atoryokna lze vykreslit na stranˇeklienta (napˇr.pomoc´ı sady grafick´ych n´astroj˚u)nebo na na stranˇeserveru (od spr´avce skladby).

• Bezpeˇcnostn´ı – Wayland izoluje vstup a v´ystup kaˇzd´ehookna a dosa- huje d˚uvˇernosti,integrity a dostupnosti v obou pˇr´ıpadech. Origin´aln´ıX design postr´ad´atyto d˚uleˇzit´ebezpeˇcnostn´ıprvky, k ˇcemuˇzmusela b´yt vyvinut´arozˇs´ıˇren´ıpro zm´ırnˇen´ıdopad˚uabsence t´etofunkcionality.

• Komunikace mezi procesy – Server X poskytuje z´akladn´ımetodu komunikace mezi klienty X. Z´akladn´ıprotokol Wayland nepodporuje komunikaci mezi klienty Wayland v˚ubec a odpov´ıdaj´ıc´ıfunkce by mˇely b´ytimplementov´any v desktopov´ych prostˇred´ıch.

• S´ıt’ov´e funkce – je architektura, jej´ıˇzj´adrobylo navrˇzenopro provoz pˇress´ıt’. Wayland s´amo sobˇenenab´ız´ıtransparent- nost s´ıtˇe;spr´avce skladby vˇsakm˚uˇzeimplementovat jak´ykoli protokol vzd´alen´eplochy. Kromˇetoho prob´ıh´av´yzkumstreamov´an´ıobraz˚uz Wa- ylandu.

Wayland a Qt Dˇr´ıvˇejˇs´ıverze Qt poskytuj´ıQt Window System (QWS), kter´ysd´ıl´ınˇekter´ez n´avrhov´ych c´ıl˚uWaylandu. QWS vˇsakpodporuje pouze klienty zaloˇzen´ena Qt a jeho architektura nen´ıvhodn´apro modern´ıhardware zaloˇzen´yna OpenGL. S Qt 5 ˇzaˇcalapr´acena Waylandu. Spouˇstˇen´ıaplikac´ıQt jako klient˚uWaylandu je ofici´alnˇepodporov´anaod Qt 5.4.[18]

Wayland a Tk V roce 2016 bylo vyps´ann´avrhna t´emapro stipendijn´ıakci GSoC, kter´ese mˇelozab´yvat implementac´ıpˇr´ım´epodpory Tk pro Wayland.2. V roce 2017 byl proveden port Tcl/Tk do Waylandu, pomoc´ıjeho podpory SDL, v r´amciprojektu undroidwish (varianta portu Tcl/Tk do Androidu), nicm´enˇenikdy nebyl pˇrid´ando hlavn´ıv´yvojov´evˇetve.[20]

HiDPI Dalˇs´ımotivac´ıjsou dnes rozˇsiˇruj´ıc´ıse HiDPI obrazovky. HiDPI je pojem pro vysokou hustotu pixel˚una palce obrazovky. Pˇresnˇeji,HiDPI monitor je takov´y,kter´ym´av´ıceneˇzdvojn´asobn´eDPI oproti standardn´ımu monitoru. D´ıkytomu od aplikac´ıvyˇzadujeˇsk´alov´an´ı,a to hlavnˇev pˇr´ıpadˇevelikosti

2N´avrht´ematuje dostupn´yna https://wiki.tcl-lang.org/page/GSoC+Idea%3A+Tk+ Backend+for+the+Wayland+Display+Protocol

16 2.7. Motivace p´ısma, ale i dalˇs´ıch prvk˚u.Toto ˇsk´alov´an´ıdobˇrefunguje pro toolkity GTK3 a Qt5. Dalˇs´ı´urovn´ım˚uˇzeb´ytprobl´em,kdy m´atepˇripojen´e2 obrazovky, jednu s HiDPI, druhou ne, a okno s aplikac´ımezi nimi pˇretahujete. Aplikaci je nutn´e v t´echv´ılipˇreˇsk´alovat – a to je podporov´anopouze na Waylandu. X Window System tuto funkci neum´ı,um´ıpouze pohled pˇribl´ıˇzit,d˚usledkem ˇcehoˇzdojde k znekvalitnˇen´ızobrazen´ı.Toto ˇsk´alov´an´ıje moˇzn´ena Waylandu nastavit a Qt si ho samostatnˇepˇreˇcte.V Tk (a Tkinteru) je tak´emoˇzn´enastavit ˇsk´alov´an´ı, nen´ıho vˇsakmoˇzn´ebˇehembˇehu zmˇenit.[21]

Shrnut´ı Vzhledem k v´yˇseuveden´emu vypl´yv´a,ˇzepro Tk neexistuje podpora, kter´aby umoˇzˇnovala ho pouˇz´ıvat na Waylandu, tak, aby naplnila poˇzadavky plynouc´ız ˇc´ımd´alebˇeˇznˇejˇs´ıhoHiDPI zobrazen´ı.C´ılemprojektu je vyuˇz´ıt existuj´ıc´ıpodpory pro Qt a tuto podporu nab´ıdnout aplikac´ımpro Tkinter v´ymˇenoupouˇz´ıvan´esady n´astroj˚u.

17

Kapitola 3

Anal´yza

V kapitole anal´yzybl´ıˇzerozeberu d˚uleˇzit´esouˇc´astiknihovny Tkinter a bal´ıˇcku PyQt, kter´ezat´ımnebyly bl´ıˇzepops´any.

3.1 Tkinter

Jednotliv´eˇc´astiknihovny Tkinter jsem jiˇzpopsal v pˇredchoz´ıkapitole (2.4). V t´etoˇc´astise budu bl´ıˇzezab´yvat spr´avci rozloˇzen´ı, nastaven´ı objekt˚ua ud´alostmiv Tkinteru. V t´etopr´acise nebudu vˇenovat widgetu Canvas, kter´y umoˇzˇnujekreslen´ıpo obrazovce, jelikoˇzby ne´umˇernˇerozˇs´ıˇrilrozmˇerpr´ace. V t´etoˇc´astibudu pouˇz´ıvat n´asleduj´ıc´ıpojmy: • window, okno – Oznaˇcujeobd´eln´ıkovou plochu nˇekdena obrazovce. • top-level window, top-level – Oznaˇcuje okno existuj´ıc´ı nez´avisle na obrazovce. Toto okno bude pˇrizp˚usobeno podobˇea ovl´ad´an´ı dle syst´emov´ehospr´avce obrazovky. S oknem m˚uˇze b´ytpohybov´anopo obrazovce,

• widget, grafick´a komponenta – Z´akladn´ı stavebn´ı blok grafick´eho uˇzivatelsk´ehorozhran´ı. Widgetem m˚uˇzeb´yttlaˇc´ıtko, pˇrep´ınaˇc,pole pro vyplnˇen´ıuˇzivatelsk´ehovstupu, zaˇskrt´av´atko a dalˇs´ı.

• frame, r´am – Z´akladn´ıorganizaˇcn´ıjednotka Tkinteru. M˚uˇzeobsahovat widgety ve vztahu rodiˇc(r´am)a potomci (widgety).

3.1.1 Spr´avci rozloˇzen´ı Tkinter disponuje tˇremitakzvan´ymigeometrick´ymispr´avci (spr´avci rozloˇzen´ı). Vytvoˇren´ywidget nen´ıvykreslen, dokud nen´ızaˇrazenpomoc´ınˇekter´ehoz geo- metrick´ych spr´avc˚u. Prvn´ımz geometrick´ych spr´avc˚uje grid. Ten umoˇzˇnuje rozloˇzen´ıdo mˇr´ıˇzky (tabulky), tedy widgety mohou b´ytum´ıstˇeny do konkr´etn´ıhoˇr´adkua sloupce,

19 3. Analyza´ respektive buˇnkytabulky. S´ıˇrkaˇr´adkuneboˇ sloupce tabulky je urˇcenapodle nejvˇetˇs´ıbuˇnkydan´ehoˇr´adkunebo sloupce. Pro widgety, kter´enezapln´ıcelou buˇnku,je moˇzn´especifikovat, co s m´ıstemnav´ıc– jestli m´ab´ytwidget rozˇs´ıˇren´y, nebo m´ab´ytm´ısto ponech´anopr´azdn´e.Widget je tak´emoˇzn´erozt´ahnoutpo v´ıcebuˇnk´ach.[22] Druh´ymz geometrick´ych spr´avc˚uje pack. Tento spr´avce je v´yraznˇesloˇzitˇejˇs´ı z hlediska algoritmu um´ıstˇen´ıwidget˚u,neˇzspr´avce grid. Spr´avce pack umist’uje widgety na okraje voln´ehoprostoru dan´ehorodiˇcepotomk˚u.Algoritmus spr´avce pack na vstupu pˇrij´ım´alist potomk˚uv poˇrad´ı,ve kter´embyli vytvoˇren´ı,spoleˇcnˇe s dalˇs´ımnastaven´ım(napˇr.vlastnost -side, tedy strana, na kterou m´ab´yt potomek um´ıstˇen),a spoˇc´ıv´azjednoduˇsenˇev tˇechto kroc´ıch:

1. Alokuj m´ıstopo stran´ach podle nastaven´ı -side.

2. Rozhodni dimenze obsahu podle poˇzadovan´evelikosti, nastaven´ıokraj˚u (-padx, -pady, -ipadx, -ipady) a nastaven´ırozt´ahnut´ı(-fill).

3. Pokud je obsah menˇs´ı,neˇzaplikovan´yprostor, aplikuj nastaven´ıvlastnosti -anchor, tedy kotvy k nˇejak´estranˇea nebo rohu.[23]

Moˇznostmipro zvolen´ıstrany jsou: TOP, LEFT, BOTTOM, RIGHT, tedy po- stupnˇeshora, zleva, zdola a zprava. Um´ıstˇen´ıshora a zleva se chov´apodle oˇcek´av´an´ı,tedy widgety jsou um´ıstˇeny shora nebo zleva. V pˇr´ıpadˇeum´ıstˇen´ı zprava nebo zdola jsou widgety rovnˇeˇzum´ıstˇeny v oˇcek´avan´empoˇrad´ı,ale v pˇr´ıpadˇe,ˇzenen´ıdostatek prostoru, mohou b´ytpˇrekryt´e.Obecnˇeje moˇzn´e pouˇz´ıtdohromady v r´amcijednoho rodiˇceum´ıstˇen´ıdo r˚uzn´ych stran, spr´avce pack se vˇsakdoporuˇcujepouˇz´ıvat bez kombinac´ıum´ıstˇen´ık r˚uzn´ymstran´am, jelikoˇzv´ysledeknemus´ıb´yttakov´y,jak´yby v´yvoj´aˇroˇcek´aval. Pro sloˇzitˇejˇs´ı rozm´ıstˇen´ıje doporuˇcenopouˇz´ıtspr´avce grid.[6] Posledn´ımspr´avcem rozloˇzen´ıje place, kter´yumoˇzˇnujewidget potomka vloˇzitna konkr´etn´ı(relativn´ı)souˇradnice rodiˇce.

3.1.2 Standardn´ıatributy Kaˇzd´ywidget v Tkinteru m´amnoˇzinu vlastnost´ı,kter´eje moˇzn´eu nˇejnastavit. Tyto vlastnosti koresponduj´ıs vlastnostmi, kter´eje moˇzn´enastavit widget˚um z Tk. Je moˇzn´eje nastavit jiˇzv konstruktoru widgetu, nebo po vytvoˇren´ı pomoc´ı config metody. Mezi standardn´ıatributy Tkinteru dle [24] patˇr´ı:3

• Dimenze – nastaviteln´epomoc´ır˚uzn´ych mˇer– centimetry a milimetry, palce, body.

3Z tohoto seznamu byly vyˇrazeny ˇc´asti t´ykaj´ıc´ıse widgetu Canvas, dle ´uvodu sekce.

20 3.1. Tkinter

• Geometrick´e ˇretˇezce – zad´avaj´ı velikosti a um´ıstˇen´ı dle form´atu wxh±x±y, kde w zastupuje ˇs´ıˇrku, h v´yˇsku,spoleˇcnˇeoddˇelen´ep´ısmenem x“. N´asledujeˇc´ast x, kter´am˚uˇzeb´ytkladn´a,nebo z´aporn´a– urˇcuje ” posun okna zleva (plus) nebo zprava (m´ınus) po ose x (horizont´aln´ı).To sam´eplat´ıpro ˇc´ast y po vertik´aln´ıose shora dol˚u.

• Barvy – Nastaven´ıbarvy pozad´ı,popˇred´ı(text), a to pomoc´ıˇctyˇraˇz dvan´actim´ıstn´ehoRGB k´odu,nebo v´ybˇeremz pˇreddefinovan´ych barev.

• Typ p´ısma – Obvykl´enastaven´ıp´ısma(rodina, velikost, tuˇcnost, n´aklon, podtrˇzen´ı,proˇskrtnut´ı.

• Um´ıstˇen´ı, kotvy – Um´ıstˇen´ıdo urˇcit´ehorohu, na urˇcitoustranu, nebo doprostˇred.

• Styl okraje, reli´efu – Simulovan´e3D efekty okraj˚uwidgetu.

• Bitmapa – Nˇekter´ewidgety umoˇzˇnuj´ınastaven´ıbitmapy jako vlastn´ı ikony.

• Kurzor – Vzhled kurzoru je moˇzn´emˇenit(napˇr´ıkladna z´akladˇeurˇcit´ych ud´alost´ı– naznaˇcen´ıprokliku)

• Obr´azky – V Tkinteru je moˇzn´ezobrazit bitmapy a nebo barven´e obr´azkyve form´atu .git, .pgm, .ppm. Dalˇs´ıform´aty je moˇzn´ezobrazit v Tkinteru pomoc´ıtˇr´ıdy ImageTk z bal´ıˇcku Pillow pro Python.

3.1.3 Ud´alosti Widgety z Tkinteru maj´ınˇekolik vestavˇen´ych funkc´ıobsluhuj´ıc´ıpˇrich´azej´ıc´ı ud´alosti– napˇr´ıkladtlaˇc´ıtko reaguje na stisk pomoc´ızavol´an´ıfunkce, kter´a je pˇriˇrazenak jeho atributu pˇr´ıkaz(callback), pole pro zad´an´ıuˇzivatelsk´eho vstupu po z´ısk´an´ızamˇeˇren´ı(focus) reaguje na stisknut´ıkl´avesy t´ım,ˇzestisknut´y znak vypln´ıdo pole. Tyto vestavˇen´efunkce vˇsak Tkinter rozˇsiˇrujemoˇznost´ı sv´az´an´ı (bind) ud´alostia umoˇzˇnujetak pˇridat,zmˇenitnebo odebrat chov´an´ıaplikace po vzniknut´ıurˇcit´eud´alosti.Tyto ud´alostijsou pak obsluhov´any v metod´ach widget˚unebo v jin´ych funkc´ıch. Sv´az´an´ıje realizov´anospojen´ımud´alostia t´etoobsluhuj´ıc´ımetody. Sv´az´an´ım˚uˇzeprobˇehnoutna nˇekolika ´urovn´ıch:

• instance – Ud´alostm˚uˇzeb´ytsv´az´anas metodou z konkr´etn´ıhowidgetu. Toho je doc´ılenopomoc´ıuniverz´aln´ımetody bind volan´ena instanci.

• tˇr´ıda – Ud´alostm˚uˇzeb´ytsv´az´anas metodou ze vˇsech widget˚udan´e tˇr´ıdy. Toho je doc´ılenopomoc´ıuniverz´aln´ımetody bind class volan´ena jak´emkoliv widgetu. T´etofunkce je moˇzn´evyuˇz´ıt,pokud m´amenˇekolik

21 3. Analyza´

shodn´ych objekt˚u,kter´emaj´ı na nˇejakou ud´alostreagovat jednotnˇe. Danou ud´alostobslouˇz´ıwidget, na kter´emje aktu´alnˇezamˇeˇren´ı(focus). • aplikace – Ud´alostm˚uˇzeb´ytsv´az´anapˇr´ımos celou aplikac´ı– nez´aleˇz´ıtak, kde se aktu´alnˇenach´az´ıkurzor. Sv´az´an´ıje doc´ılenopomoc´ıuniverz´aln´ı metody bind all volan´ena jak´emkoliv widgetu.[25] Tkinter tak´epodporuje tzv. sekvence ud´alost´ı,kdy je obsluhuj´ıc´ıfunkce vol´anapouze tehdy, kdy je vzor sekvence splnˇenkompletnˇe.Zjednoduˇsenˇese jedn´ao ˇretˇezec,kter´ykombinuje r˚uzn´emodifik´atory, typ ud´alostia detail ve form´atu <[modifik´ator-]...typ ud´alosti[-detail]>. Napˇr´ıkladsekvence se vzorem vyvol´aud´alostpouze tehdy, kdy bude souˇcasnˇezm´aˇcknut (typ ud´alosti KeyPress) modifik´ator Control (kl´avesa Ctrl) a detail A (kl´avesa A). Modifik´atoryje moˇzn´ekombinovat, m´ıstonˇekter´ych typ˚uud´alost´ı(stisknut´ıtlaˇc´ıtkana kl´avesnici nebo myˇsi)je moˇzn´eps´atpouze ˇc´astdetail.

3.1.4 Modul ttk Od Tk verze 8.5 je v Tkinteru dostupn´ymodul ttk. Ten nahrazuje nˇekolik z widget˚udostupn´ych v Tkinteru za nov´e,takzvan´et´ematizovan´ewidgety (themed widgets). Tyto nov´etˇr´ıdyvn´aˇs´ıdo Tkinteru n´asleduj´ıc´ıpˇr´ınosy.

Vzhled specificky´ pro platformu Ve verz´ıch pˇredTk 8.5 byla jedna z nejˇcastˇejˇs´ıch st´ıˇznost´ına aplikace Tk ta, ˇzenevyhovovaly stylu r˚uzn´ych platforem. Modul ttk umoˇznilps´ataplikace jedn´ımzp˚usobem pro vˇsechny platformy. Aplikace m˚uˇzevypadat jako Windows aplikace v syst´emu Windows, jako MacOS aplikace v syst´emu MacOS atd., beze zmˇeny programu. Kaˇzd´y moˇzn´yodliˇsn´yvzhled je reprezentov´anpojmenovan´ymt´ematemz ttk. Takto existuje napˇr´ıklad klasick´et´ema“, kter´yTkinter norm´alnˇepouˇz´ıv´a. ”

Zjednoduˇsen´ı a zobecnˇen´ı chov´an´ı widget˚u ve specifickych´ stavech V klasick´emTkinteru je nutn´enastavit nˇekolik vlastnost´ıwidgetu, aby se widget choval nebo vypadal jina v souvislosti na r˚uzn´ych podm´ınk´ach. Napˇr´ıklad u widgetu Button je moˇzn´enastavit atribut foreground, coˇzatribut pro nastaven´ıbarvy n´apisutlaˇc´ıtka.V pˇr´ıpadˇe,ˇzeby bylo tˇrebamanipulovat s touto barvou v dobˇe,kdy je tlaˇc´ıtko aktivn´ı,nebo neaktivn´ı,musela by b´yt nastavena barva tak´ev atributech activeforeground a disabledforeground. Pokud by se takto jednalo o v´ıce atribut˚u, brzo zaˇcneb´ytdefinice velice nepˇrehledn´a.Modul ttk toto dekomponuje na pˇrehlednˇejˇs´ı syst´emstav˚u, kter´ych m˚uˇzewidget nab´yvat, a mapy styl˚u,kde m˚uˇzeb´ytpro kaˇzd´ystav urˇcen´yjin´ystyl.[26] Kromˇenahrazen´ıwidget˚u ttk tak´edoplˇnujeTkinteru o pokroˇcil´ewidgety. Jedn´ımz pˇr´ıklad˚uje widget tˇr´ıdy Combobox, coˇzje kombinace tˇr´ıdy Entry pro zad´an´ıvstupu uˇzivatelem a v´ybˇerupomoc´ırozbalovac´ıhomenu.

22 3.2. PyQt

3.1.5 Dialogy Pro tvorbu dialog˚uexistuje v Tkinteru nˇekolik modul˚u.Prvn´ı z nich je tkMessageBox – po jeho importov´an´ıje moˇzn´erychle vytvoˇrit dialogy pro potvrzen´ıakce, opakov´an´ıakce, zobrazen´ıchybov´ehl´aˇsky, informace a nebo upozornˇen´ı.V tˇechto dialoz´ıch je moˇzn´enastavit titulek, zpr´avua dalˇs´ımoˇznosti – v´ychoz´ıtlaˇc´ıtko a ikonu okna.[27] Pro pr´acise soubory existuje druh´ymodul jm´enem tkFileDialog, kter´y poskytuje dva typy dialog˚u– dialog pro v´ybˇera otevˇren´ısouboru a dialog pro uloˇzen´ıdo souboru. Pˇrit´etoakci je definovat povolen´etypy soubor˚u, v´ychoz´ı sloˇzkua v´ychoz´ıjm´enosouboru. Jako u pˇredchoz´ıch dialog˚uje moˇzn´enastavit titulek okna.[28] Dalˇs´ımuˇziteˇcn´ymmodulem je dialog pro v´ybˇerbarvy – tkColorChooser. Uveden´emoduly je moˇzn´eimportovat pˇr´ımo,nebo je moˇzn´eimportovat soubory s jejich implementac´ınapˇr´ımo,dle odpov´ıdaj´ıc´ıhosouboru viz 2.4.

3.2 PyQt

PyQt se skl´ad´az nˇekolika r˚uzn´ych komponent. PyQt verze 4 se ˇc´asteˇcnˇetˇemito komponentami liˇs´ı,d´aleuvaˇzujijen PyQt verze 5. Existuje nˇekolik modul˚u pro Python, kter´ejsou instalov´any spoleˇcnˇes bal´ıˇckem PyQt5:

• QtCore – Z´akladn´ıQt tˇr´ıdy, kter´enejsou urˇceny pro pr´aci s GUI.

• QtGui – Z´akladn´ıQt tˇr´ıdypro pr´acis GUI – rozˇsiˇruje QtCore.

• QtWidgets – Tˇr´ıdypro vytv´aˇren´ıklasick´ych desktopov´ych prostˇred´ı, zastupuj´ıobvykl´ewidgety.

• ... a mnoh´edalˇs´ı,jak je moˇzn´enaleznout v [29].

QtCore Modul QtCore obsahuje kromˇez´akladn´ıch tˇr´ıdtak´esmyˇckyud´alost´ı a Qt mechanismus sign´al˚ua slot˚u. Zahrnuje tak´eabstrakce nez´avisl´ena platformˇepro animace, stavov´eautomaty, vl´akna,mapovan´esoubory, sd´ılenou pamˇet’, regul´arn´ıv´yrazy a uˇzivatelsk´eho nastaven´ı.[30]

Qt namespace Tento jmenn´yprostor je d˚uleˇzitousouˇc´ast´ımodulu QtCore. Obsahuje nˇekolik d˚uleˇzit´ych identifik´ator˚upro Qt knihovnu. Identifik´atory maj´ıkonstanty pro pr´acis rozloˇzen´ımobjekt˚uv oknˇe,podobu kurzoru, na- staven´ıˇcasov´ez´ony, v´yznamspeci´aln´ıch znak˚ukl´avesnice, form´atov´an´ıtextu a mnoho dalˇs´ıho.Kaˇzd´akonstanta m´adefinovanou svoj´ıˇc´ıselnouhodnotu,

23 3. Analyza´

kter´aodpov´ıd´asv´emu v´yˇctov´emu typu (enum). Kompletn´ıv´yˇcetpro PyQt5 je moˇzn´enaleznout v [31].4

QtGui Modul QtGui obsahuje tˇr´ıdypro integraci okenn´ıhosyst´emu, mani- pulace s ud´alostmi,2D grafiku, z´akladn´ızobrazov´an´ı,p´ısmoa text. Obsahuje tak´ekompletn´ısadu vazeb na OpenGL. Vˇetˇsinouse vˇsakpouˇz´ıv´arozhrann´ı vyˇsˇs´ı´urovnˇe,jako je rozhrann´ıobsaˇzen´ev modulu QtWidgets.[33]

3.2.1 QWidget QWidget je tˇr´ıda,kter´aje souˇc´ast´ımodulu QtWidgets. Z t´etotˇr´ıdyvych´az´ı resp. dˇed´ıvˇsechny objekty souvisej´ıc´ıs grafick´ymuˇzivatelsk´ymprostˇred´ım. Je tak´ez´akladn´ımprvkem pro stavbu uˇzivatelsk´eho rozhran´ı.Rovnˇeˇzz´ısk´av´a informace o ud´alostech, kter´emohl vyvolat uˇzivatel pomoc´ıkliknut´ıˇcipohybem myˇs´ı,nebo stisknut´ımnˇejak´ych kl´aves. Widgety je moˇzn´eskl´adatna sebe pomoc´ısyst´emu rodiˇc˚ua potomk˚u. Widgety jsou zobrazeny podle dan´ehopoˇrad´ı.Potomci jsou vloˇzen´ıdo rodiˇc˚u. Widget bez rodiˇceje naz´yv´anoknem (window). Jedn´ase vˇetˇsinouo widgety, kter´emaj´ıvlastn´ıokno, n´azev a tˇrebai ikonu. Typicky je takto urˇcenwidget QMainWindow, vˇcetnˇejeho specializace QDialog, kter´yse pouˇz´ıv´apro zobrazen´ı r˚uzn´ych uˇzivatelsk´ych dialog˚u.Potomci jsou v rodiˇcizobrazeny dle nastaven´eho rozloˇzen´ı(viz d´alev 3.2.4). Mnoho metod je definovan´ych pˇr´ımov tˇr´ıdˇe QWidget, dalˇs´ıjsou definov´any v jeho specializuj´ıc´ıch se tˇr´ıd´ach, kter´eposkytuj´ıre´alnoufunkˇcnost, napˇr´ıklad:

• QLabel – Textov´ynadpis pole pro zad´an´ıvstupu.

• QEntry – Pole pro zad´an´ıuˇzivatelsk´ehovstupu.

• QPushButton – Stisknuteln´etlaˇc´ıtko.[34]

3.2.2 Ud´alosti Widgety odpov´ıdaj´ına ud´alosti,kter´ejsou typicky zp˚usobeny uˇzivatelskou akc´ı. Qt takto vznikl´eud´alostipˇred´av´awidgetu vol´an´ımjeho obsluhuj´ıc´ıch metod, s instanc´ıtˇr´ıdydˇed´ıc´ız QEvent, s informacemi o dan´eud´alosti. Z´akladn´ımiobsluhuj´ıc´ımimetodami (sloty) tˇr´ıdy QWidget jsou:

• paintEvent() – Vol´anapˇrinutnosti pˇrekreslitwidget.

• resizeEvent() – Vol´anapˇrinutnosti zmˇenitvelikost widgetu.

4V dokumentaci pro PyQt5 chyb´ımnoho ˇc´ıseln´ych hodnot – d´alej´ıvyuˇz´ıv´amhlavnˇe z toho d˚uvodu, ˇzejsem pouˇzilPyQt5 pˇriimplementaci prototypu. V pˇr´ıpadˇez´ajmu a nalezen´ı kompletnˇejˇs´ıdokumentace shled´av´amdokumentaci pro PyQt4 ´uplnˇejˇs´ı- viz. [32].

24 3.2. PyQt

• mousePressEvent() – Vol´anapˇrikliknut´ıtlaˇc´ıtkamyˇsi,kdy je kurzor v oblasti widgetu.

• mouseReleaseEvent() – Vol´ana,pokud je tlaˇc´ıtko myˇsiuvolnˇeno,mus´ı n´asledovat za pˇredchoz´ıud´alost´ı.

• mouseDoubleClickEvent() – Vol´anapˇridvojit´emkliknut´ıtlaˇc´ıtkamyˇsi. Souˇcasnˇejsou vˇsakvol´any odpov´ıdaj´ıc´ıobsluhuj´ıc´ıfunkce pro jednotliv´e kliknut´ınebo uvolnˇen´ı. Tyto metody jsou pro widgety, umoˇzˇnuj´ıc´ıpr´acis kl´avesnic´ı,rozˇs´ıˇreny o: • keyPressEvent() – Vol´anakdykoliv je stisknut´akl´avesa na kl´avesnici. Pˇridelˇs´ımstisknut´ıje tato metoda vol´anaopakovanˇe.

• focusInEvent() – Vol´ana kdyˇzwidget nabyl zamˇeˇren´ı(focus) kl´avesnice. Obsluha t´etoud´alostiby mˇelaobsahovat i uˇzivatelsky viditelnou reakci widgetu.

• focusOutEvent() – Vol´anakdyˇzwidget pozbyl zamˇeˇren´ıkl´avesnice. Dalˇs´ımiobsluhuj´ıc´ımimetodami jsou: • mouseMoveEvent() – Vol´anapˇri pohybu kurzoru za doby stisknut´ı tlaˇc´ıtkamyˇsi.

• keyReleaseEvent() – Vol´anakdykoliv kdy je kl´avesa na kl´avesnici stisknut´apo delˇs´ıdobu opˇetuvolnˇen´a.

• wheelEvent() – Vol´anapˇripohybu koleˇckamyˇsi. • enterEvent() – Vol´anapˇrivstupu kurzoru do oblasti widgetu. • leaveEvent() – Vol´anapˇriodchodu kurzoru z oblasti widgetu. • moveEvent() – Vol´anapˇripˇresunu widgetu relativnˇek jeho rodiˇci. • closeEvent() – Vol´anauzavˇren´ıwidgetu uˇzivatelem.[34]

3.2.3 Moˇznostizobrazen´ıwidget˚u Kromˇestandardn´ıch styl˚uwidget˚upro kaˇzdou platformu lze widgety tak´e modifikovat podle pravidel uveden´ych v ˇsablonˇestyl˚u. Sablonaˇ m´apodob- nou strukturu, jako ˇsablonastyl˚upro kask´adov´yjazyk CSS, jelikoˇzj´ımbyla inspirov´ana. Tato funkce umoˇzˇnujepˇrizp˚usobitvzhled konkr´etn´ıch widget˚u,aby uˇzivateli poskytly vizu´aln´ıpodnˇety o jejich ´uˇcelua napovˇedˇelytak uˇzivateli, jak´ym zp˚usobem prvky pouˇz´ıt. Sablonuˇ je vˇsakmoˇzn´etak´epouˇz´ıtna celou aplikaci nebo vˇsechny instance konkr´etn´ıtˇr´ıdy. Jak´ym´ab´ytaplikov´anstyl je ˇreˇseno kask´adovˇe,jako je tomu v CSS.[35]

25 3. Analyza´

3.2.4 Management rozloˇzen´ıwidget˚u Widgety – potomci jsou v rodiˇcizobrazeny dle jeho nastaven´ehorozloˇzen´ı. Rozloˇzen´ıje automaticky pˇrid´anona widget, pokud je widget um´ıstˇendo rodiˇce, stejnˇetak je vloˇzenwidget do rodiˇcet´ım,ˇzeje mu nastaveno rozloˇzen´ı rodiˇce. PyQt5 obsahuje 4 z´akladn´ıtypy rozloˇzen´ı:

• QGridLayout – Umoˇzˇnujerozloˇzen´ıformou mˇr´ıˇzky(tabulky), kdy je moˇzn´edefinovat sloupec a ˇr´adek v tabulce, kde m´ab´ytpotomek vykreslen, spoleˇcnˇes moˇznost´ı slouˇcen´ı nˇekter´ych bunˇeka nastaven´ı roztaˇzen´ı widgetu.

• QBoxLayout – M´a2 podtypy:

– QVBoxLayout – Umoˇzˇnujewidgety rozloˇzit vertik´alnˇe.Je moˇzn´e nastavit smˇerˇrazen´ıwidget˚u. – QHBoxLayout – Umoˇzˇnujewidgety rozloˇzithorizont´alnˇe. – Obˇemaje moˇzn´enastavit smˇerpˇrid´av´an´ıwidget˚u(zprava doleva, shora dol˚u,a naopak).

• QFormLayout – Rozloˇzen´ıvhodn´epro formul´aˇre– sdruˇzujepole pro vstup s jejich popisky. M˚uˇzeb´ytpouˇzitspoleˇcnˇes kontejnerem QButtonGroup, kter´ysdruˇzujetlaˇc´ıtka.

• QStackedLayout – Rozloˇzen´ıodpov´ıdaj´ıc´ız´asobn´ıku– v jeden okamˇzik je vidˇetjen jeden widget.

Algoritmus urˇcen´ıvelikost´ıwidget˚upro vykreslen´ıpostupuje n´asledovnˇe:

1. Vˇsemwidget˚umje pˇridˇeleno m´ıstov souladu s jejich pomocn´ymifunkcemi pro urˇcen´ıpotˇrebn´evelikosti.

2. Pokud m´anˇekter´yz widget˚unastaven faktor roztaˇzen´ıs hodnotou vˇetˇs´ı neˇznula, je jim pˇridˇelenom´ıstov pomˇeruk jejich rozˇsiˇruj´ıc´ımfaktor˚um.

3. Pokud m´anˇekter´yz widget˚unastaven faktor roztaˇzen´ına nulu, z´ısk´av´ıce m´ısta,pouze pokud ˇz´adn´yjin´ywidget nebude vyˇzadovat prostor. Z nich je m´ıstonejprve pˇridˇelenowidget˚umse z´asadourozˇsiˇruj´ıc´ıse velikosti.

4. Jak´ymkoli widget˚um,kter´ymje pˇridˇeleno m´enˇem´ısta,neˇzje jejich mi- nim´aln´ıvelikost (nebo n´apovˇedaminim´aln´ıvelikosti, pokud nen´ıuvedena minim´aln´ıvelikost), je pˇridˇelenatato minim´aln´ıvelikost, kterou vyˇzaduj´ı.

5. Jak´ymkoli widget˚um,kter´ymje pˇridˇeleno v´ıcem´ısta,neˇzje jejich ma- xim´aln´ıvelikost, je pˇridˇelenprostor o t´etovelikosti.[36]

26 3.3. PySide

3.2.5 Dialogy Dialogy v PyQt jsou realizov´any pomoc´ıtˇr´ıdy QDialog z modulu QtWidgets a dalˇs´ıch specializovan´ych tˇr´ıd.Tyto specializovan´etˇr´ıdyobsluhuj´ınapˇr´ıklad chybov´ea jin´ehl´aˇsky, manipulaci se soubory a tisk.[37]

3.3 PySide

PySide se od PyQt pˇr´ıliˇsneliˇs´ı,jak uˇzbylo pops´anov 2.5.4. Pro ˇc´astN´avrhu a Realizace jsem zvolil bal´ıˇcekPyQt verze 5. Za urˇcit´ych podm´ınekby za pomoci nˇekolika substituc´ınemˇelb´ytprobl´emvyvinut´yprototyp spustit i pro bal´ıˇcek PySide verze 2 (verze 2 je urˇcen´apro Qt5).

27

Kapitola 4

N´avrh

V t´etokapitole proberu n´avrhy mapov´an´ıa zhodnot´ımje podle navrˇzen´ych parametr˚u.V druh´eˇc´astinavrhnu kvantifik´atory, dle kter´ych bude moˇzn´e implementovan´emapov´an´ızhodnotit.

4.1 Mapov´an´ı

V kapitol´ach 2.4 a 2.5 jsem popsal, jak´ymzp˚usobem Tkinter mapuje sv´e tˇr´ıdyna Tk komponenty a jak´ymzp˚usobem PyQt vyuˇz´ıv´aSIP, popˇr´ıpadˇe jak PySide vyuˇz´ıv´aShiboken. Z tˇechto mapov´an´ıje moˇzn´evyj´ıtpro n´avrh vlastn´ıch mapov´an´ıkomponent a funkc´ıTkinteru na Qt komponenty a PyQt funkce. Vzhledem k tomu, ˇzePySide nen´ıpˇr´ıliˇsrozd´ıln´eod PyQt, jak jsem vysvˇetlilv 2.5.4, rozhodl jsem se d´alezohledˇnovat hlavnˇePyQt. Pro n´avrhtˇechto mapov´an´ıjsem navrhl n´asleduj´ıc´ıbody, kter´ymin´avrhy zhodnot´ım:

1. Vhodn´an´aroˇcnostpˇr´ıpravy mapov´an´ı.

2. Jednoduch´amoˇznost rozˇsiˇritelnosti.

3. Maximalizace pokryt´ımoˇznost´ıTkinteru.

4. Dalˇs´ıpˇr´ınosyn´avrhu.

4.1.1 High-level rozhran´ı Prvn´ımoˇznost´ı,kterou jsem zv´aˇzil,je implementace urˇcit´ehohigh-level rozhran´ı, tedy rozhran´ı,kter´ekompletnˇeodst´ın´ıTkinter a jak´ekoliv jeho z´avislostina Tk, a bude se napojovat pˇr´ımodo rozhran´ıbal´ıˇckuPyQt. Znamenalo by to implementaci nov´eknihovny, kter´aimplementuje tˇr´ıdya funkce, kter´ese tv´aˇr´ıjako z Tkinteru, re´alnˇeale dˇed´ız tˇr´ıdnebo volaj´ıfunkce PyQt

29 4. Navrh´

PyQt

PyQt[5] SIP Qt headers Qt ..... + Výhody PyQt - API, QtDesigner ... - "High-Level" rozhraní, komerční licence 1a + Výhody PyQt - API, QtDesigner + Výhody Qt 3a 2a - "Nový Tkinter", komerční - Nový _tkinter (modul), pouze vlastní rozhraní, DumpTk licence, pouze vlastní rozhraní cpython

TKinter

(Python) App Tkinter (knihovna) Tkinter (modul) tkinter (C) Tk Widgets (C & Tcl) Tk (C) Xlib (c)

+ Výhody PySide - API + Výhody Qt 3b 2b - "Nový Tkinter", pouze vlastní - Nový _tkinter (modul), pouze vlastní rozhraní, DumpTk-PySide cpython 1b + Výhody PySide PySide - API; LGPL licence - "High-Level" PySide[2] CPython Shiboken CLang Qt headers Qt ..... rozhraní

Obr´azek4.1: Mapov´an´ıv niˇzˇs´ıch ´urovn´ıch

Pˇrednostn´ıv´yhodou tohoto high-level rozhran´ıby jistˇebyla moˇznostim- plementovat kaˇzd´yobjekt a funkci na m´ırupotˇreb´amTkinteru. Rozˇsiˇritelnost tohoto mapov´an´ıby byla jednoduch´a- kdykoliv by bylo moˇzn´edoplnit novou tˇr´ıdu,s potˇrebn´ymiatributy a metodami, aby podporovala funkˇcnost,kterou zam´yˇsl´ıTkinter. Dalˇs´ıvn´ıman´ypˇr´ınosby mohla b´ytmoˇznostvyuˇz´ıvat tuto n´ahraduTkinteru jako hybridn´ıˇreˇsen´ı,tud´ıˇzv ˇc´asti k´oduprogramovat pro Tkinter, v dalˇs´ıˇc´asti pro PyQt. Tohoto by mohlo b´ytvyuˇzitov pˇr´ıpadˇeaplikace, kter´aby byla pˇrepisov´anaz Tkinteru do Qt – bylo by j´ımoˇzn´epˇrepisovat po ˇc´astech. Znaˇcnounev´yhodou t´etomoˇznostimapov´an´ıje jej´ıpracnost pˇr´ıpravy, jelikoˇz mal´yprototyp, kter´yjsem vyzkouˇsela kter´ypodporoval p´artˇr´ıd,ne´umˇernˇe rostl vzhledem k velikosti aplikace, kter´aby ˇreˇsen´ıv budoucnu pouˇz´ıvala. Kaˇzd´atˇr´ıda, funkce a dalˇs´ı objekty z Tkinteru by musely b´ytexplicitnˇe pˇreprogramov´any, aby poskytly odpov´ıdaj´ıc´ırozhran´ı.Tkinter je vˇsakpouze rozhran´ıpro interpretaci Tcl pˇr´ıkaz˚upro Tk, kde je nˇekolik tˇr´ıdpodobn´ych, nˇekolik atribut˚ushodn´ych, vˇcetnˇeshodn´ych metod, probl´emtohoto n´avrhu mus´ıb´ytˇreˇsiteln´y,v niˇzˇs´ı´urovni komunikace Tkinteru s Tk komponentami.

4.1.2 Mapov´an´ıv niˇzˇs´ıch ´urovn´ıch Pro pˇrehlednostniˇzˇs´ıch ´urovn´ıknihoven Tkinter, PyQt a PySide jsem pˇripravil n´asleduj´ıc´ıdiagram 4.1. Kaˇzd´aˇsipkapˇredstavuje urˇcitouvrstvu knihoven, pˇr´ıpadnˇemoˇznost,kde knihovny propojit na stejn´e´urovni. Na 4.1 jsou moˇznostinamapov´an´ıoznaˇceny n´asledovnˇe:

• Vazby 1a a 1b – Vytvoˇren´ıhigh-level rozhran´ı– viz. 4.1.1

30 4.1. Mapov´an´ı

• Vazby 2a a 2b – Vytvoˇren´ınov´ehomodulu tkinter.

• Vazby 3a a 3b – Pˇreps´an´ıtkinteru v C.

Vazby 3a a 3b jsem ihned vylouˇcil,jelikoˇzby znamenaly, ˇzemodul Tkinter, spravovan´yve standardn´ıknihovnˇePythonu, by musel m´ıtz´avislosti do Qt frameworku, coˇzby bylo pravdˇepodobnˇenebylo pˇrijatokomunitou, a musel by tak b´ytvytvoˇren nov´yTkinter. Tyto vazby tedy nepˇrin´aˇs´ınic nov´ehooproti vazb´am2a a 2b, kter´etak´evyˇzaduj´ıvytvoˇren´ınov´ehoTkinteru. Nav´ıcby zmˇenabyla provedena v tkinteru v C. Vazby 2a a 2b mi tak pˇrijdousmysluplnˇejˇs´ıoproti vazb´am3a a 3b. Realizace vazeb 2a ˇci2b by znamenala pˇripojen´ık vazb´amvygenerovan´ych pomoc´ıSIP ˇciShibokenu. Tuto pr´acivˇsakjiˇzrealizovaly knihovny PyQt a PySide.

4.1.3 Mapov´an´ıv r˚uzn´ych ´urovn´ıch Pˇredchoz´ımyˇslenkavazeb 2a a 2b vede k tomu, ˇzeby se Tkinter stal z´avisl´y na PyQt ˇciPySide. Tuto z´avislost je moˇzn´evymˇenitza z´avislostna modulu tkinter. Co by toto mapov´an´ıpˇrineslo? Pˇrivytvoˇren´ıaplikace v Tkinteru je nutn´einstancovat tˇr´ıdu Tk, kter´ave sv´emkonstruktoru vytv´aˇr´ıinstanci Tcl interpretu v podobˇemodulu tkinter. Tato instance je uloˇzenado promˇenn´e tk. Instance tˇr´ıdy Tk m˚uˇze b´ytjen jedna. Kaˇzd´yvytvoˇren´ywidget v Tkinteru si pˇreb´ır´areferenci z t´etopromˇenn´e,bud’ napˇr´ımo,nebo za pouˇzit´ıpomocn´efunkce. Kaˇzd´atˇr´ıdaTkinteru, kter´eodpov´ıd´a nˇejak´emu widgetu, obsahuje nebo dˇed´ımechanizmy pro pˇrekladvytvoˇren´ınebo ´upravy instance na n-tici, kterou pak pomoc´ıvol´an´ımetody tk.call s n-tic´ı jako parametrem pˇred´av´ado Tcl interpretu v modulu tkinter, jak uˇzjsem ˇc´asteˇcnˇepopsal v jak jsem popsal v 2.4.1. Metoda tk.call je vol´anav modulu tkinter kter´yje napsan´yv CPythonu. Pro lepˇs´ıpochopen´ıuv´ad´ımuk´azku– k´odtypick´ehoprogramu Hello ” world“5 v Tkinteru dle 4.2 produkuje pˇr´ıkazysestaven´ez n-tic slov v 4.3. Probl´emhigh-level ˇreˇsen´ıdle 4.1.1 spoˇc´ıval v tom, ˇzeby bylo nutn´enˇekolik vlastnost´ı a funkc´ı objekt˚uv Tkinteru implementovat opakovanˇe.Rovnˇeˇz se pot´ykals probl´ememnˇekolika moˇznost´ıpr´aces objekty, kterou Tkinter (nebo Python) podporuje. Dekompozice tˇechto akc´ına jednoduch´en-tice, kter´e Tkinter samostatnˇedekomponuje, umoˇzn´ıtyto r˚uzn´ezp˚usoby pr´aces objekty sjednotit. Tkinter nav´ıczajiˇst’uje i dalˇs´ıfunkcionality samostatnˇe,jako je pojmenov´an´ıobjekt˚ua zaveden´ıfunkc´ı,kter´emaj´ıb´ytvol´any na z´akladˇe urˇcit´eud´alosti.Toto je moˇzn´epozorovat na pˇr´ıkladuuveden´emv 4.3. T´ımse v´yraznˇesn´ıˇz´ısloˇzitostzaveden´ımapov´an´ı,kter´etyto n-tice pˇreloˇz´ıpro rozhran´ı PyQt. D´ıkydekompozici pˇr´ıkaz˚una n-tice bude moˇzn´ejednoznaˇcnˇeurˇcit,jak´e nastaven´ıwidgetu m´ab´ytprovedeno.

5Program Hello world“ je jednoduch´yprogram, kter´ym´aza ´ukol vypsat jednoduchou ” zpr´avu Hello world!“ ”

31 4. Navrh´

super (). i n i t ( master ) self .master = master self .pack()

s e l f . h i there = tk.Button(self) s e l f . h i there[”text”] = ”Hello World” s e l f . h i there[”command”] = self .say h i s e l f . h i there .pack(side=”top”)

self .quit = tk.Button(self , text=”QUIT”, fg=”red”) self . quit .command=self .master.destroy self .quit.pack(side=”bottom”)}

Obr´azek4.2: Hello world program v Tkinteru

(’frame’, ’.!application’) (’pack’, ’configure’, ’.!application’) (’button’, ’.! application .!button’) (’.!application.!button’, ’configure’, ’−text’, ’Hello World ’ ) (’.!application.!button’, ’configure’, ’−command ’ , ’ 140192520 say \ h i ’ ) (’pack’, ’configure’, ’.!application.!button’, ’−side’, ’top’) (’button’, ’.!application.!button2’, ’−text’, ’QUIT’, ’−f g ’ , ’ red ’ ) (’.!application.!button2’, ’configure’, ’−command ’ , ’ 140192493 d e s t r o y ’ ) (’pack’, ’configure’, ’.!application.!button2’, ’−side’, ’bottom’)

Obr´azek4.3: N-tice pro Tcl pˇr´ıkazvygenerovan´eprogramem Hello world 4.2

Rozˇsiˇritelnost tohoto mapov´an´ım˚uˇzeb´ytjednoduch´a,jelikoˇzspoˇc´ıv´ahlavnˇe v jednotn´emchov´an´ıwidget˚uTkinteru – widgety maj´ıspoleˇcn´eatributy a funkce, kter´ejsou doplnˇeny o atributy a funkce specifick´epro widget. V pˇr´ıpadˇe pˇrid´an´ınovˇepodporovan´ehowidgetu bude staˇcitpˇridatpouze obsluhu funkc´ı specifick´ych pro widget. Pokryt´ımoˇznost´ıTkinteru by mˇelob´ytprakticky neomezen´e. Tento zp˚usob mapov´an´ınaz´yv´amjako mapov´an´ı v r˚uzn´ych ´urovn´ıch“, je- ” likoˇzmapov´an´ıbude provedeno z pomˇernˇen´ızk´evrstvy (aˇzu modulu tkinter) na vysokou vrstvu – rozhran´ıPyQt ˇciPySide.

4.1.4 Vybran´yzp˚usobmapov´an´ı Dle sekce 4.1.3 je mapov´an´ıv r˚uzn´ych ´urovn´ıch vhodn´eˇreˇsen´ı,jak mapovat Tkinter rozhran´ıdo Qt komponent. Modul tkinter je moˇzn´evymˇenitpˇr´ımo v Tkinteru, a to tak, ˇzev m´ıstˇevytv´aˇren´ıinstance Tcl interpretu bude nam´ısto tohoto interpretu vytvoˇrenaobaluj´ıc´ıtˇr´ıda,kter´azabal´ımetody (hlavnˇemetodu call) interpretu a umoˇzn´ıtak vlastn´ıimplementaci, kter´azpracuje n-tice a vytvoˇr´ıprostˇred´ıpomoc´ıQt komponent.

32 4.2. N´avrhkvantifik´ator˚u

Za tˇechto podm´ınekby vˇsakmusela b´ytvytvoˇrenanov´aknihovna Tkinteru, kter´aby toto umoˇzˇnovala. T´ımjsem se vr´atilk jiˇzvylouˇcen´emu ˇreˇsen´ı,kter´eby znamenalo Tkinteru poskytnout z´avislostina Qt komponent´ach. Lepˇs´ızp˚usob je podˇedittˇr´ıdu Tk z Tkinteru a v tomto potomkovi implementovat konstruktor tak, ˇzereferenci uloˇzenouv promˇenn´e tk zmˇen´ıza obaluj´ıc´ıtˇr´ıdu,kter´abude vol´ananam´ıstoklasick´ehoTcl interpretu. Tato obaluj´ıc´ıtˇr´ıda,kterou m˚uˇzeme pojmenovat TkWrapper, bude muset obsahovat minim´alnˇemetodu call pro zad´an´ıpˇr´ıkaz˚uv podobˇen-tic a metodu createcommand, obsluhuj´ıc´ıvytvoˇren´ıpˇr´ıkazujako reakce na nˇejakou ud´alost. Kromˇedalˇs´ıch pomocn´ych metod bude muset implementovat metodu mainloop, kterou je Tkinter program spuˇstˇen. Vzhledem ke konstrukci pˇr´ıkaz˚ubude nutn´ev r´amciimplementace metody call udrˇzovat informace o instanc´ıch objekt˚u(widget˚u)a instanc´ıpˇr´ıkaz˚u k ud´alostem,jak napov´ıd´apˇr´ıklad n-tic v 4.3. D´ıky´upravˇepopsan´ev pˇredchoz´ıch odstavc´ıch bude moˇzn´eimplementovat nov´yn´astroj, kter´ybude moct b´ytimportov´anm´ıstoknihovny Tkinter.

4.2 N´avrh kvantifik´ator˚u

Pro zhodnocen´ı ´uspˇeˇsnostinavrˇzen´ehomapov´an´ı a jeho implementace je tˇrebanavrhnout kvantifik´atory. Dle n´asleduj´ıc´ıhoseznamu uv´ad´ımnavrˇzen´e kvantifik´atorys d˚uvodem jejich navrˇzen´ı:

• Implementovan´e tˇr´ıdy (widgety) – Pro ´uˇcelynov´ehorozhran´ıje tˇrebapodporovat co nejv´ıcewidget˚u,kter´ejsou podporov´any v Tkinteru.

• Vychoz´ ´ı parametry – Widgety z Tkinteru sd´ılej´ınˇekter´eatributy a funkce, jelikoˇzvˇsechny dˇed´ıze stejn´ıtˇr´ıdy(Misc). Pro ´uˇcelynov´eho rozhran´ıbude vhodn´epodporovat co nev´ıcez tˇechto parametr˚u.

• Speci´aln´ı parametry – Widgety z Tkinteru maj´ıi sv´especi´aln´ıpara- metry, kter´ebude tak´enutn´ebr´atv potaz, tuto skupinu vˇsakrozliˇsuji od v´ychoz´ıch parametr˚u.

• Funkcionality – Tkinter podporuje nˇekolik funkcionalit, kromˇesa- motn´ehovytv´aˇren´ıwidget˚uumoˇzˇnujejejich manipulaci pomoc´ıspr´avc˚u geometrie, sv´az´an´ıud´alostis urˇcit´ymifunkcemi, tvorbu dialogy a dalˇs´ı funkce.

• Rozˇsiˇritelnost – Tkinter jistˇenen´ızastaral´yprojekt a st´aleje v tomto projektu pˇrisp´ıv´anonˇekolik vylepˇsen´ıjeho tv˚urci– komunitou. Imple- mentace by tak mˇela b´ytvhodnˇerozˇsiˇriteln´a,aby umoˇznilarozˇs´ıˇren´ıpro novˇepˇridan´etˇr´ıdy, parametry a dalˇs´ı.

33

Kapitola 5

Realizace

Realizaci vybran´ehomapov´an´ıjsem zapoˇcals Pythonem verze 3.7, nicm´enˇe pro testov´an´ıs IDLE jsem pˇreˇselna Python 3.8, kter´ybyl v aktu´aln´ıverzi IDLE vyˇzadov´an. Pro mapov´an´ıdo frameworku Qt jsem vyuˇzilbal´ıˇcekPyQt5, jelikoˇzv dobˇeimplementace nebyly dostupn´evazby na Qt6, nyn´ınejnovˇejˇs´ı verze Qt toolkitu. Projekt implementace jsem pojmenoval jako dumpTk“, nicm´enˇesamotn´y ” modul (n´astroj) jsem nazval jako Qtinter“, podobnˇe,jako byl nazv´anTkinter. ” Zdrojov´yk´odbyl zdokumentov´anv anglick´emjazyce, form´atzdrojov´ehok´odu byl zkontrolov´anpomoc´ı flake8. Zdrojov´yk´odbyl um´ıstˇendo veˇrejn´eho repozit´aˇrena serveru GitHub: https://github.com/SohajCZ/dumpTk a je moˇzn´eho d´aleˇs´ıˇritna z´akladˇepermisivn´ısvobodn´elicence (MIT licence).

5.1 Struktura repozit´aˇre

Struktura repozit´aˇreje zjednoduˇsenˇepops´anav pˇrehledu 5.1.

5.2 Qtinter

Hlavn´ı soubor n´astroje Qtinter je soubor init .py. Na zaˇc´atkutohoto souboru jsou importov´any tˇr´ıdyz Tkinteru, kter´ejsou pouˇz´ıv´any v r´amci aplikac´ıpro Tkinter. Toto rozhran´ıtak´eurˇcuje,kter´etˇr´ıdybudou Qtinterem podporov´any. Tkinter (pro Python 3) se obvykle importuje s jedn´ımz n´asleduj´ıc´ıch zp˚usob˚u: • import tkinter * • import tkinter as tk Po importu mus´ı b´ytvytvoˇrenainstance tˇr´ıdy Tk. Tˇr´ıda Tk v tomto souboru zde dˇed´ız p˚uvodn´ıtˇr´ıdyTk v Tkinteru, coˇzznamen´a,ˇzevˇetˇsina

35 5. Realizace

. examples...... Sloˇzkas implementovan´ymipˇr´ıklady all user input widgets.pyPouˇz´ıv´avˇetˇsinu uˇzivatelsk´ych widget˚u events.py...... Pˇr´ıkladpr´aces ud´alostmi grid.py...... Pˇr´ıkladpr´aces rozloˇzen´ımv mˇr´ıˇzce hello world.py ...... Typick´yTkinter Hello world“ pˇr´ıklad ” menu and dialog.py...... Uk´azkamenu, akc´ıv menu a dialogu pack.py ...... Pˇr´ıkladpr´aces rozloˇzen´ımpomoc´ıbal´ıˇcku(pack) idlelib ...... Kopie zdrojov´eho k´oduIDLE z ofici´aln´ıhorepozit´aˇre LICENSE...... Soubor licence (MIT) qtinter...... Hlavn´ısloˇzkaimplementovan´ehobal´ıˇcku constants.py...... Konstanty odpov´ıdaj´ıc´ıhodnot´amv Tk event builder.py ...... Sestaven´ıud´alost´ı– 5.4 event translate.py...... Pˇrekladhodnot ud´alost´ı– 5.5 filedialog.py...... Funkce pro tvorbu souborov´ych dialog˚u– 5.6 implementer.py...... Tˇr´ıdaimplementuj´ıc´ıvˇetˇsinu logiky – 6.3 init .py ...... Hlavn´ısoubor implementovan´ehoˇreˇsen´ı– 5.2 layouter.py...... Tˇr´ıdaLayouter – spr´avce geometrie – 5.7 parameters mapping.py ..... Mapov´an´ıparametr˚ua hodnot – 5.9 tktoqt.py...... Obsahuje funkce pro pˇrekladmapov´an´ı– 5.10 translate qt core.py...... Podp˚urn´efunkce pro Layouter – 5.8 README.md requirements.txt...... Soubor pro nastaven´ıvirtu´aln´ıhoprostˇred´ı setup.py...... Setup skript pro instalaci bal´ıˇckuqtinter Obr´azek5.1: Struktura repozit´aˇre metod z˚ust´av´astejn´a.Tkinter je tak vyuˇz´ıv´anjako preprocesor poˇzadavk˚u. Pro pouˇzit´ıvlastn´ılogiky je implementov´anatˇr´ıda TkWrapper, podobnˇe,jako v Tkinteru. Tˇr´ıdaTk z Tkinteru t´ımto wrapperem obaluje vazbu na Tk, ale ve skuteˇcnosti zde TkWrapper obaluje vlastn´ıtˇr´ıdu- Implementer - kter´y implementuje hlavn´ılogiku cel´eho n´astroje. V´ysledkem je, ˇzepˇrivol´an´ıTkinter m´ıstometod origin´aln´ıhoTcl interpretu vol´ametody implementovan´ev tomto TkWrapperu. Tyto vlastn´ımetody jsou hlavnˇe:

• call – Tato metoda p˚uvodnˇevol´aTcl interpret z modulu tkinter, kter´y pˇred´av´aargumenty do Tcl/Tk, kter´yje zpracov´av´a.Tyto argumenty maj´ıpevnou strukturu pro Tcl, jsou proto snadno analyzovateln´ev tˇr´ıdˇe Implementer. Pˇresnˇeji,t´etometodˇejsou pˇred´av´any jiˇzdˇr´ıve popsan´e n-tice dle 4.3.

• createcommand – tato metoda tak´evol´amodul tkinter, se z´amˇerem vytvoˇritpˇr´ıkazv Tcl/Tk. Implementovan´atˇr´ıda QtCallWrapper, po-

36 5.3. Implementer

dobnˇejako p˚uvodn´ıtˇr´ıda CallWrapper v Tkinteru, zapouzdˇrujetento pˇr´ıkaz(po rozkladu ze zapouzdˇren´ız instance tˇr´ıdy CallWrapper) a pˇred´ajej tak´einstanci tˇr´ıdy Implementor, aby tento pˇr´ıkazuloˇzila,pro pozdˇejˇs´ıvyzvednut´ıpˇrisv´az´an´ıs ud´alost´ı.

Tˇr´ıdaStringVar zde prototypuje pouˇzit´ıpromˇenn´ych z Tk. Protoˇzepro- mˇenn´eTk jsou p˚uvodnˇeuloˇzeny v Tcl, nen´ısnadn´ez´ıskathodnotu promˇenn´e. Proto zde Qtinter dˇed´ıp˚uvodn´ıpromˇennoua nahrad´ıji pro vlastn´ıtˇr´ıdou, jej´ıˇzhodnota nen´ıuloˇzenav Tcl.

5.3 Implementer

Tato tˇr´ıdaimplementuje vˇetˇsinu logiky Qtinteru. Tˇr´ıda Implementer dˇed´ı z PyQt tˇr´ıdy QApplication. Hlavn´ımetodou tˇr´ıdy Implemetor je metoda call. Tato metoda pˇreb´ır´ajako argument n-tice pro pˇr´ıkazdo Tcl a analyzuje tuto n-tici v n´asleduj´ıc´ıch kroc´ıch:

1. Pˇreskoˇcnebo vynech vˇsechny pˇr´ıkazy, kter´enejsou uˇziteˇcn´epro Qt.

2. Pˇr´ıkazobvykle obsahuje nˇekter´edalˇs´ıparametry, ty nejprve extrahuj. Tyto parametry jsou pak d´alepˇreloˇzeny pomoc´ıpˇrekladov´ych slovn´ık˚u do form´at˚upro PyQt.

3. Pokud se hlavn´ıpˇr´ıkazt´yk´asv´az´an´ıud´alost´ı,probˇehnezpracov´an´ıtˇechto sv´az´an´ıa metoda je ukonˇcena.Bˇehemtohoto se pouˇz´ıv´avol´an´ıfunkce if binding holds, protoˇzeTkinter umoˇzˇnujev´azat pˇr´ıkazy na speci´aln´ı zkratky, ale Qt m´asv´esloty na widgetech a speci´aln´ızkratky jsou obvykle ˇreˇseny pˇr´ımoaˇzv tomto slotu. Vzhledem k tomu, ˇzeslot je zde realizov´an jiˇzexistuj´ıc´ıfunkc´ıoˇcek´avaj´ıc´ıchov´an´ısv´az´an´ıud´alost´ız Tkinteru, je nutn´etuto logiku ˇreˇsitsamostatnˇe.Pro ud´alostise pouˇz´ıvaj´ıdva dalˇs´ı soubory: event translate.py a event builder.py.

4. Pokud se hlavn´ıpˇr´ıkazt´yk´arozloˇzen´ı,spr´avygeometrie a podobnˇe, pˇredejpˇr´ıkazmetodˇe add widget, a metodu pot´eukonˇci.

5. Pokud se hlavn´ıpˇr´ıkazt´yk´akonfigurace n´asleduj´ıc´ıhoseznamu widget˚u – ListWidget, ComboBox, Menu a MenuAction – vyˇreˇs(zaloˇz,nastav) tyto widgety a metodu pot´eukonˇci.Tyto widgety vyˇzaduj´ıspeci´aln´ı logiku jejich obsluhy.

6. Vytvoˇrz´akladn´ıwidgety. Bˇehemtohoto je pouˇzit translate class dict, kter´yobsahuje pˇrekladz n´azvuobjektu Tk (nebo ttk) do tˇr´ıdyPyQt. D´alenastav widget dle dalˇs´ıch parametr˚ua metodu pot´eukonˇci.

Dalˇs´ımetody tˇr´ıdy Implementer jsou:

• add to namer – Mal´afunkce, kter´aˇreˇs´ıprobl´ems nab´ıdkami(viz 5.3).

37 5. Realizace

• create menu – Funkce, kter´aspouˇst´ıliˇstunab´ıdekv aplikaci.

• show – Reˇsen´ızobrazuj´ıc´ıspr´avn´ywidgetˇ jako toplevel, coˇzje problema- tick´eve chv´ıli,kdy je pouˇzitomenu, nebo nen´ıpˇr´ımovytvoˇrenhlavn´ı sn´ımek(viz 5.3).

• call method – Konfiguruje widget pomoc´ıjeho metod s dan´ymipa- rametry – pouˇzit´epˇrikroku 2. N´azevmetody a parametry je tˇreba nejprve pˇreloˇzitz n´azvoslov´ıa form´atuTcl/Tk pomoc´ıfunkce translate parameters for class.

• createcommand – Protoˇzeje pˇr´ıkazjiˇzvytvoˇrenpˇridˇr´ıvˇejˇs´ımvol´an´ı metody createcommand v tˇr´ıdˇe TkWrapper, tato metoda pouze uloˇz´ı pˇr´ıkazdo mezipamˇeti“ instance tˇr´ıdy Implementer. ” • add widget – Pˇrid´awidget do rozloˇzen´ırodiˇce.

• mainloop – Spust´ıPyQt aplikaci.

Bˇehemtohoto pouˇz´ıv´atˇr´ıda Implementer vlastn´ıch pamˇet´ı“, pˇr´ıpadnˇe ” cach´ı“, jak bylo predikov´anov n´avrhu: ” • namer – Ukl´ad´awidget pod sv´ymn´azvem pouˇz´ıvan´yv Tkinteru. Toho je vyuˇzitopro vyhled´an´ı rodiˇcewidgetu pˇrivytv´aˇren´ı widgetu, pˇri pˇriˇrazov´an´ıpˇr´ıkaz˚ua pˇridalˇs´ıch situac´ıch.

• commands – Ukl´ad´apˇr´ıkazyvytvoˇren´emetodou createcommand. Pouˇz´ıv´a se kdyˇzje pˇr´ıkazpˇriˇrazov´anwidgetu (resp. je pˇriˇrazenna nˇejak´yslot widgetu).

• layouter – Ukl´ad´arozloˇzen´ı, pˇresnˇejitˇr´ıdu Layouter, pod n´azvem rodiˇcovsk´ehowidgetu, kter´ytoto rozloˇzen´ıpouˇz´ıv´a.

• masters – Ukl´ad´arodiˇcewidgetu pod n´azvem widgetu.

• bindings – Ukl´ad´avazby ud´alost´ıpod n´azvem widgetu. Tyto vazby tedy jsou pouˇz´ıv´any se ve funkci call if binding holds.

Cache“ layouter a masters se pouˇz´ıvaj´ıspoleˇcnˇe– kaˇzd´ywidget, na ” kter´emje pouˇzit´ajak´akoli spr´ava rozloˇzen´ı,je um´ıstˇendo rozloˇzen´ırodiˇce widgetu. Pokud toto rozloˇzen´ırespektive instance tˇr´ıdy Layouter zat´ımnee- xistuje, je vytvoˇreno.Toto funguje rekurzivnˇe.Kl´ıˇce tˇechto pamˇet´ı,jak bylo ˇreˇceno,jsou n´azvywidget˚u,jelikoˇzv Tcl/Tk jsou objekty identifikov´any pomoc´ı jejich jm´ena. Druhou tˇr´ıdouv souboru implementer.py, ve kter´emje tˇr´ıda Implementer um´ıstˇena,je tˇr´ıda Menu. Tato tˇr´ıdadˇed´ız tˇr´ıdy QMainWindow, coˇzumoˇzˇnuje aplikaci m´ıtnab´ıdku.V Tkinteru m´atˇr´ıda Application moˇznostpˇriˇrazen´ı nab´ıdky, tˇr´ıda QApplication toto vˇsaknepodporuje. Pokud aplikace nem´a

38 5.4. Pˇrekladud´alost´ı

ˇz´adn´emenu, tˇr´ıda Implementer si bud’ vytvoˇr´ıvlastn´ıwidget nebo dostane vlastn´ıwidget jako hlavn´ıokno, kter´eje zobrazeno metodou show. Pokud m´aaplikace m´ıtnab´ıdku,tento v´ychoz´ıwidget je vymˇenˇenza tˇr´ıdu Menu. Tˇr´ıdasama o sobˇenen´ıopravdov´anab´ıdka,je to jen toplevel widget, kter´y m´amoˇznostpˇriˇrazen´ı nab´ıdky (d´ıky dˇedˇen´ı z QMainWindow). Nab´ıdka je vytvoˇrenauvnitˇrtˇr´ıdymetodou add menu. Tkinter nˇekdypˇriˇrad´ıoznaˇcen´ıakce nab´ıdkypˇredsamotnou akc´ı,proto je implementov´anametoda remeber label. Nab´ıdkav Tkinteru je zcela odliˇsn´aod nab´ıdkyv PyQt, je ji tak tˇrebaaplikaci pˇredatrozd´ılnˇe,coˇzje vyˇreˇsenopˇrivol´an´ı metody add to namer v tˇr´ıdˇe Implementer. Detailnˇeje moˇzn´etoto naj´ıtv pˇrekladech metod tˇr´ıd Menu a Implementer v mapov´an´ıparametr˚u5.9. Jelikoˇztˇr´ıda Application z Tkinteru m˚uˇze z´ıskatnab´ıdku,pˇr´ıkaz -menu je pˇreloˇzen do metody create menu v tˇr´ıdˇe Implementer, kter´ave skuteˇcnostipouze nastav´ıpˇr´ıznak,kter´yje pot´epouˇzit k rozhodnut´ı,zda m´ab´ytinstance nab´ıdkydeklarov´anajako centr´aln´ıwidget v metodˇe show.

5.4 Pˇreklad ud´alost´ı

Mechanismus sv´az´an´ıud´alostis urˇcit´ympˇr´ıkazem ˇcifunkc´ıje zastˇreˇsennejdˇr´ıve dekompozic´ıv metodˇe createcommand tˇr´ıdy TkWrapper (5.2) a pot´esv´az´an´ım v r´amciimplementace metody call tˇr´ıdy Implementer (6.3). Protoˇzeje aplikaci vytvoˇrenapomoc´ıQt toolkitu, doch´az´ık ud´alostem v Qt, ale p˚uvodn´ıprogram v Tkinteru mohl pouˇz´ıtud´alostve sv´ych funkc´ıch nebo metod´ach, kter´ebyly sv´az´any s urˇcitouud´alost´ı.Proto je tˇrebaud´alost v Qt pˇreloˇzitzpˇetna ud´alostv Tk. K tomuto pˇrekladudoch´az´ı v tˇr´ıdˇe EventBuilder v souboru jm´enem event builder.py. Tkinter implementuje podobnou logiku s ud´alostmiz Tk. KdyˇzTkinter v´aˇzefunkci k nˇejak´eud´alosti,nev´aˇzejen samotnou ud´alost,ale v´aˇzetak´elogiku, kter´afunguje nejen jako slot, ale tak´eukl´ad´aparametry ud´alostiv pˇredpˇripraven´emˇretˇezci. Detaily tohoto ˇretˇezceje moˇzn´enal´eztv [6]. Je vhodn´epoznamenat, ˇze chov´an´ınˇekter´ych typ˚uud´alost´ız Tkinteru nen´ıstejn´ejako v PyQt, napˇr´ıklad QKeyEvent nem´amoˇznostpracovat s pozic´ıud´alosti.

5.5 Podpora ud´alost´ı

Pro podporu pˇreklad˚uud´alost´ıdle 5.4 vznikl soubor event translate.py. Tento soubor obsahuje podp˚urn´efunkce k pˇrekladuatribut˚ua jmen pouˇz´ıvan´ych se pˇripr´acis ud´alostmi.Funkce z tohoto souboru jsou pouˇzit´epˇripˇriˇrazov´an´ı vazby na ud´alosti,pˇrinast´an´ıud´alostiv Qt, pˇrikontrole sv´az´an´ıa pˇripˇrekladu ud´alostiz Qt na ud´alost Tk, m´atak nˇekolik vyuˇzit´ı.

39 5. Realizace

• key translator – Pˇreloˇz´ıznak z Qt na znak z TkKey. Tento pˇreklad je proveden pouze porovn´an´ımascii, kter´eby mˇelob´ytpˇresn´epro vˇetˇsinu obvykl´ych kl´aves, dle [38] a [32] 6. Je moˇzn´esi vˇsimnout,ˇzeud´alosti PyQt nerozliˇsuj´ı,jestli byl znak velk´ep´ısmeno,nebo ne.

• mouse button translator – Pˇreloˇz´ı QtMouseButton na TkMouseButton nebo naopak, jelikoˇzˇc´ıslov´an´ıtlaˇc´ıtekmyˇsije realizov´anov Tk a Qt rozd´ılnˇe.

• sequence parser – Analyzuje sekvenci (vzor pro vyvol´an´ı ud´alosti) z form´atupro Tkinter na ˇcitelnˇejˇs´ıa jednotnˇejˇs´ıform´at.

• tk modifier to qt – Pˇreloˇz´ımodifik´atorz Tk a pˇreloˇz´ıjej do Qt modi- fik´atoru. Ne kaˇzd´ymodifik´atorz Tk m´asvoj´ıodpov´ıdaj´ıc´ımodifik´ator v Qt.

• get method for type – N´azevtypu ud´alostipro Tkinter pˇreloˇz´ı na metodu resp. slot pro widget z PyQt. Je moˇzn´epozorovat, ˇzemnoho ud´alost´ız Tk nem´aodpov´ıdaj´ıc´ıslot v Qt widgetech, nebo naopak.

5.6 Dialog pro nahr´an´ısouboru

Qtinter podporuje pouˇzit´ı dialog˚upro pr´acise soubory. Zdrojov´ysoubor filedialog jako n´ahradaza modul tkinter.filedialog. Aktu´alnˇeimple- mentuje n´asleduj´ıc´ıdialogy (nalevo je akce filedialogu z Tkinteru, napravo akce z PyQt):

• askopenfilename – pomoc´ı getOpenFileName,

• asksaveasfilename – pomoc´ı getSaveFileName,

• askopenfilenames – pomoc´ı getOpenFileNames,

• askdirectory – pomoc´ı getExistingDirectory.

Ostatn´ısouborov´edialogy nemaj´ıpˇr´ımoupodporu v PyQt.

5.7 Layouter

Soubor layouter.py obsahuje tˇr´ıdu Layouter. Tato tˇr´ıdaˇreˇs´ıspr´avurozloˇzen´ı (geometrie) pomoc´ıspr´avc˚urozloˇzen´ı QGridLayout nebo QBoxLayout z Qt, co nejpodobnˇejispr´avci geometrie v Tkinteru. Tˇr´ıda Layouter nepodporuje spr´avce geometrie place z Tkinteru. Layouter je vytvoˇrenjako neinicializovan´y.Je to proto, ˇzeinstance tˇr´ıdy Layouter je vytvoˇrenaokamˇzitˇepˇrivytv´aˇren´ıwidgetu, jak bylo pops´anov 5.3,

6Odkaz na dokumentaci PyQt verze 4 je zde uveden schv´alnˇez d˚uvodu uveden´ehov 4

40 5.7. Layouter kdy widget nemus´ıb´ytrodiˇcemˇz´adn´ehodalˇs´ıhowidgetu, rozloˇzen´ıpotomk˚u tak nemus´ıb´ytpotˇreba.Rozloˇzen´ıpro potomky je vytvoˇreno aˇzve chv´ıli,kdy je vytvoˇren dalˇs´ıwidget s p˚uvodn´ımwidgetem jako rodiˇcem. Potomek m˚uˇzeb´ytvloˇzendo rodiˇcovsk´ehorozloˇzen´ımetodou add widget. Pokud instance tˇr´ıdy Layouter nen´ıinicializov´ana,je zavol´anavnitˇrn´ıme- toda manual init. Metoda vloˇzen´ıprvnˇevloˇzen´ehopotomku rozhodne, jak´a strategie inicializace je vyuˇzita. Pokud je pouˇzitspr´avce geometrie mˇr´ıˇzky(grid), je inicializov´anainstance tˇr´ıdy QGridLayout. Pro tohoto spr´avce tˇr´ıda Layouter aktu´alnˇepodporuje urˇcen´ıˇr´adk˚ua sloupc˚u,rozpˇet´ı(slouˇcen´ı)ˇr´adk˚ua sloupc˚ua nastaven´ıparametru sticky, kter´erozhoduje, jak je vyuˇzitovoln´em´ıstov mˇr´ıˇzce. Pokud je pouˇzitspr´avce geometrie balen´ı(pack), inicializace se se liˇs´ıdle zabalen´estrany potomka (parametr side):

• Pokud je potomek zabalen k lev´e stranˇe, je inicializov´anainstance tˇr´ıdy QHBoxLayout (horizont´aln´ı)a postupnˇenaplnˇena:

1. QHBoxLayout (pro potomky zabalen´ek lev´estranˇe), 2. QHBoxLayout s QVBoxLayout (pro potomky zabalen´ek horn´ıstranˇe – shora) a QVBoxLayout s opaˇcn´ymˇrazen´ım(pro potomky zabalen´e k doln´ıstranˇe– zdola), 3. QHBoxLayout s opaˇcn´ymˇrazen´ım(pro potomky zabalen´ek prav´e stranˇe).

– Toto odpov´ıd´atˇremsloupc˚um,kde prostˇredn´ısloupec umoˇzˇnuje balen´ıze shora a ze spoda.

• Pokud je potomek zabalen k jin´e neˇz lev´e stranˇe, je inicializov´ana instance tˇr´ıdy QVBoxLayout (vertik´aln´ı)a postupnˇenaplnˇenainstancemi tˇr´ıd:

1. QVBoxLayout (pro potomky zabalen´ek horn´ıstranˇe– shora), 2. QVBoxLayout s QHBoxLayout (pro potomky zabalen´ek lev´estranˇe) a QHBoxLayout s opaˇcn´ymˇrazen´ım(pro potomky zabalen´ek prav´e stranˇe), 3. QVBoxLayout s opaˇcn´ymˇrazen´ım(pro potomky zabalen´ek doln´ı stranˇe– zdola).

– Toto odpov´ıd´atˇremˇr´adk˚um, kde prostˇredn´ıˇr´adekumoˇzˇnujebalen´ı zleva a zprava.

Tyto dvˇestrategie balen´ıse uk´azalyjako nejpodobnˇejˇs´ıˇreˇsen´ıspr´avce geometrie balen´ı(pack) z Tkinteru a tak´enejl´epe vypadaj´ıc´ı,jelikoˇzzabalen´ı prvn´ıhowidgetu ke spodn´ınebo prav´estranˇenevytv´aˇrelograficky vhodn´e

41 5. Realizace v´ysledky. Moˇznostitˇr´ıdy Layouter tedy omezuj´ıpouˇzit´ıspr´avce geometrie pack. Po inicializaci tˇr´ıda Layouter pouˇz´ıv´asamostatnˇemetody pack widget nebo grid widget. V pˇr´ıpadˇebalen´ı(pack) m´atˇr´ıda Layouter odkazy na kaˇzd´erozloˇzen´ı(vlevo, vpravo, dole, nahoˇre),vˇsechny jsou vytv´aˇreny pokaˇzd´e. Tˇr´ıda Layouter nepodporuje m´ıch´an´ırozloˇzen´ı,jakmile je inicializov´ana, druh rozloˇzen´ı(bal´ıˇcek,mˇr´ıˇzka)se jiˇznem˚uˇzezmˇenit.Pokud je pˇrid´anpotomek vyˇzaduj´ıc´ıvloˇzen´ıdo rozd´ıln´ehorozloˇzen´ı,je vyvol´anav´yjimka.Toto chov´an´ı sice Tkinter podporuje, nicm´enˇeopˇetdoch´az´ık pˇr´ıliˇsnepˇredpov´ıdateln´ym v´ysledk˚um. Layouter je podle sv´edefinice rekurzivn´ıstruktura. Druh rozvrˇzen´ınelze kombinovat v jednom rodiˇcovsk´emwidgetu, ale rodiˇcovsk´ywidget m˚uˇze b´yt um´ıstˇenv jin´emdruhu rozloˇzen´ıneˇzjeho vlastn´ıdruh rozvrˇzen´ı,coˇztak´eplat´ı pro jeho potomky a tak d´ale.

5.8 QtCore konstanty

Soubor translate qt core obsahuje podp˚urn´efunkce pro tˇr´ıdu Layouter. V souˇcasn´edobˇeobsahuje 1 metodu:

• translate align – Pˇreloˇz´ıparametr sticky z Tkinteru do hodnoty konstanty QtAlignment z Qt. K tomu se pouˇz´ıvaj´ıse bitov´eoperace.

Soubor je vhodn´ymkandid´atempro rozˇs´ıˇren´ıo dalˇs´ıpˇrekladykonstant z Tk na konstanty Qt a naopak.

5.9 Mapov´an´ıparametr˚u

Myˇslenkavybran´ehomapov´an´ıdle 4.1.3 spoˇc´ıv´av tom, ˇzejednotliv´anasta- ven´ıwidget˚ubude moˇzn´ejednoznaˇcnˇepˇreloˇzitdo PyQt. Zdrojov´ysoubor parameters mapping.py obsahuje mapov´an´ı,kter´evyuˇz´ıv´ak pˇrekladupara- metr˚umetoda call method z tˇr´ıdy Implementer. Toto mapov´an´ıje vyuˇzito pro pˇrekladn´azv˚uparametr˚una urˇcit´ımetody urˇcit´ych widget˚uz PyQt a pro pˇreklad hodnot tˇechto parametr˚u.Implementov´any jsou n´asleduj´ıc´ıstruktury:

• parameters names mapping – Tato struktura mapuje atributy pˇr´ıkazu Tcl/Tk metod´amQt a vlastn´ıch objekt˚u.Vlastn´ıobjekty jsou zahrnuty, kv˚ulipodrobnostem implementace, jako je probl´ems nab´ıdkou (viz popis tˇr´ıdyImplementer v 6.3).

• parameters values mapping – Tato struktura mapuje hodnoty atribut˚u Tcl/Tk na platn´ehodnoty pro parametry metod PyQt a vlastn´ıch tˇr´ıd. Pouˇzit´aje rovnˇeˇzpro hodnoty, kter´ese t´ykaj´ıstylistick´estr´anky.

• get mapping – Mapov´an´ız´ıskan´ena z´akladˇedan´etˇr´ıdyz Tkinteru.

42 5.10. Pˇrekladdle mapov´an´ı- tktoqt

Cel´emapov´an´ıpro call method z tˇr´ıdy Implementer dle 6.3 je z´ısk´ano funkc´ı get parameters names mapping a get parameters values mapping s pomoc´ıpriv´atn´ıfunkce get mapping. Tato struktura mapov´an´ıbyla takto implementov´ana,aby bylo moˇzn´eji jednoduˇserozˇs´ıˇrito nov´evlastnosti, kter´eQtinter bude podporovat, a to pouze jednoduch´ymz´asahemdo t´eto struktury. V prvn´ı´urovni struktury je vˇzdy kl´ıˇcemn´azevtˇr´ıdywidgetu v Qt, vlastn´ıtˇr´ıdaQtinteru, nebo kl´ıˇc all. Kl´ıˇc all slouˇz´ıpro standarn´ıatributy vˇsech widget˚uz Tkinteru. V druh´e´urovni dle kl´ıˇcez prvn´ı´urovnˇet´etostruktury je slovn´ık,kter´ym´ajako kl´ıˇcvlastnosti pro Tcl (dle vygenerovan´en-tice) a hodnotou kl´ıˇceje v pˇr´ıpadˇe:

• parameters names mapping – funkce, kterou je moˇzn´evolat v PyQt (nebo Qtinteru) pro danou tˇr´ıdudle prvn´ı´urovnˇe(nebo vˇsechny dle kl´ıˇce all).

• parameters values mapping – c´ılov´yform´athodnoty.

V uk´azce5.2 je naznaˇceno,jak je moˇzn´epomoc´ıtˇechto struktur:

• Nastavit mapov´an´ıTk vlastnosti -text na metodu setText pro vˇsechny objekty z PyQt.

• Nastaven´ıpopˇred´ıvlastnost´ı -fg, kter´aje pˇrekl´ad´anana funkci nastaven´ı ˇsablony setStyleSheet z PyQt, jeˇzvyˇzadujetak´ezform´atov´an´ıvstupn´ı hodnoty pomoc´ı parameters values mapping.

• Nastaven´ısv´az´an´ıud´alostipo kliknut´ına slot tˇr´ıdy QPushButton.

5.10 Pˇreklad dle mapov´an´ı- tktoqt

Samotn´ypˇrekladpodle struktur z 5.9 je prov´adˇenv souboru tktoqt.py. Tento soubor obsahuje funkce, kter´eˇreˇs´ıpˇrekladz pˇr´ıkazuTcl/Tk na metody a parametry validn´ıpro PyQt tˇr´ıdy. Tohoto doc´ıl´ıpomoc´ın´asleduj´ıc´ıch funkc´ı:

• translate parameters values – Pˇreloˇz´ıhodnoty parametr˚udo form´atu pro metody PyQt tˇr´ıd.

• translate parameters names – Pˇreloˇz´ın´azvyparametr˚udo n´azv˚ume- tod PyQt tˇr´ıd.

• translate parameters for class – Pˇreloˇz´ın´azvyparametr˚ua hodnot parametr˚udo form´atuPyQt pro dan´yn´azevtˇr´ıdyz PyQt / vlastn´ıtˇr´ıdy.

43 5. Realizace

parameters names mapping = { ” a l l ” : { ’−text’: ’setText’, ’−fg’: ’setStyleSheet’, } , ”QPushButton” : { ’−command’: ’clicked.connect’, } , }

parameters values mapping = { ” a l l ” : { ’−fg’: ’color: {} ;’, } , ”QWidget” : { ’−background ’: ’background−c o l o r : {} ;’, } , }

Obr´azek5.2: Uk´azka mapovac´ıch struktur

44 Kapitola 6

Testov´an´ıa zhodnocen´ı

Bˇehemimplementace prob´ıhalok otestov´an´ıimplementovan´ehomapov´an´ı pˇrev´aˇznˇepomoc´ımanu´aln´ıhotestov´an´ıpohled˚ujednoduch´ych aplikac´ı,do- plnˇen´eo automatizovan´etesty nˇekter´ych funkcion´aln´ıch ˇc´ast´ın´astroje Qtinter.

6.1 Regresn´ıtestov´an´ı

Jelikoˇzjsem implementaci Qtinteru v´ıcekr´atv pr˚ubˇehu tvorby pˇrepisoval, bylo vhodn´ezv´aˇzitmoˇznostiautomatizace regresn´ıhotestov´an´ıpro pohledy aplikac´ı. Tato automatizace testov´an´ı pohled˚um˚uˇzeprob´ıhat pomoc´ı n´astroj˚u obsahuj´ıc´ıtechnologii OCR (z anglick´ehoOptical Character Recognition), kter´aum´ı rozpoznat p´ısmo na obr´azku.Tento obr´azekje moˇzn´evytvoˇrit pomoc´ıbal´ıˇcku pyautogui pro Python. Mimo jeho dalˇs´ıfunkce um´ıudˇelat sn´ımekobrazovky. Po tom, co je obr´azekpoˇr´ızen,je tˇrebaz obr´azkuanalyzovat text. K tomu je moˇzn´evyuˇz´ıtPython bal´ıˇcek tesserocr, kter´yintegruje Tesseract rozhran´ız C++ pro rozpozn´an´ıtextu. Ve sloˇzce ocr ve zdrojov´ych k´odech jsem pˇridalmenˇs´ıpˇr´ıkladpouˇzit´ıtohoto n´astroje. Bohuˇzel jsem nenaˇsel vhodn´enastaven´ı,pˇrikter´em by byla detekce textu spolehliv´a,nav´ıctento zp˚usobnemˇelmoˇznostkontrolovat tvary nebo styly tlaˇc´ıtek,ohraniˇcen´ıa dalˇs´ıch d˚uleˇzit´ych ˇc´ast´ıpohled˚u. Silnˇejˇs´ın´astroj pro tento typ testov´an´ıje n´astroj openQA. Tento n´astroj umoˇzˇnujeautomatizovan´etestov´an´ıcel´ehooperaˇcn´ıhosyst´emu, od jeho in- stalaˇcn´ıhoprocesu po jeho nastaven´ı.Tento n´astroj je produktem projektu openSUSE. S´ılatohoto n´astroje spoˇc´ıv´av moˇznostidefinovat takzvan´e jehly“7, ” coˇzjsou zjednoduˇsepohledy spr´avn´ehov´ysledkuurˇcit´ehopˇr´ıkazu.OpenQA je schopn´etyto pohledy porovnat a zajistit kontrolu grafick´ehov´ystupu v´ysledku. Jehlou nemus´ıb´ytcel´aoblast pohledu, m˚uˇzeto b´ytjen jeho ˇc´ast.V pˇr´ıpadˇe ˇc´ast´ıje nutn´epoˇc´ıtats t´ım,ˇzeopenQA staˇc´ınaj´ıtjehlu kdekoliv v pohledu pro oznaˇcen´ıtestu jako ´uspˇeˇsn´eho.Jehly je moˇzn´evytv´aˇretv n´astroji Python

7Vych´az´ız fr´aze hledat jehlu v kupce sena“, respektive find needle in haystack“. ” ”

45 6. Testovan´ ´ı a zhodnocen´ı

Needle Editor. N´astroj openQA je nativnˇedostupn´ypro openSUSE distribuci, v dalˇs´ıch distribuc´ıch je moˇzn´eho pouˇz´ıvat v n´astroji docker. Funguje tak, ˇzeve virtualizovan´emprostˇred´ıspust´ızadan´yobraz operaˇcn´ıhosyst´emu a provede pˇr´ıkazyzadan´ev programovac´ımjazyce . Pro vlastn´ı´uˇcelytestov´an´ıje n´astroj openQA ˇcastovyuˇz´ıv´antak, ˇzeje rozˇs´ıˇrennˇejak´yexistuj´ıc´ıpˇr´ıpadtestov´an´ız openQA o ˇc´ast,kde bude kromˇe spuˇstˇen´ıobrazu operaˇcn´ıhosyst´emu tak´espuˇstˇenaaplikace pracuj´ıc´ıs bal´ıˇckem Qtinter, a podoba aplikace bude testov´anav˚uˇci pˇripraven´ymjehl´am,kter´e jsou pˇridan´ev jednotliv´ych testovac´ıch pˇr´ıpadech. Tuto moˇznostjsem zkouˇsel, bohuˇzelse mi ale nepodaˇrilo ´uspˇeˇsnˇespustit instanci ve virtualizovan´em prostˇred´ıv dockeru.[39]

6.2 Otestov´an´ıs aplikac´ıIDLE

Po implementaci proveden´epodle pˇredchoz´ıkapitoly jsem vyzkouˇselprogram IDLE spustit se z´avislost´ına bal´ıˇckuQtinter. Jelikoˇzspuˇstˇen´ıhl´asilonˇekolik chyb, rozˇs´ıˇriljsem implementovan´eˇc´astibal´ıˇckuQtinter o nˇekolik ˇc´ast´ı,kter´e nebyly plnˇeimplementov´any. Avˇsakani po nˇekoliker´emopakov´an´ıtohoto procesu jsem nebyl schopn´yIDLE korektnˇespustit. Vytvoˇriljsem proto sadu jednoduˇsˇs´ıch pˇr´ıklad˚u,kter´ejsem zanesl do sloˇzky examples ve zdrojov´ych k´odech, a na kter´ych je moˇzn´epozorovat implementovan´efunkcionality. Tˇemito pˇr´ıkladyjsou:

• all user input widgets.py – Pˇr´ıkladvykresluj´ıc´ıvˇetˇsinu uˇzivatelsk´ych widget˚u.Kromˇemoˇznost´ıvyplnˇen´ıwidget˚u,tlaˇc´ıtekpro ukonˇcen´ıpro- gramu a rozloˇzen´ıdo mˇr´ıˇzkytak´etento pˇr´ıkladprezentuje pr´acis menu a otev´ır´an´ımsouborov´ych dialog˚u.

• events.py – Pˇr´ıkladpr´aces ud´alostmi,reaguje na kliknut´ımyˇsinebo zm´aˇcknut´ıkl´avesy. Rozliˇsuje,kter´etlaˇc´ıtko myˇsibylo stisknuto a do konzole tiskne hodnotu odpov´ıdaj´ıc´ıpro Tkinter.

• grid.py – Pˇr´ıkladpr´aces rozloˇzen´ımv mˇr´ıˇzce.Kliknut´ımna stˇredov´e tlaˇc´ıko je zmˇenˇeno jeho rozˇs´ıˇren´ıa ukotven´ıv prostˇredn´ıch (voln´ych) buˇnk´ach tabulky.

• hello world.py – Typick´yTkinter Hello world!“ pˇr´ıklad. ” • menu and dialog.py – Uk´azkamenu, akc´ıv menu, podmenu a dialogu pro v´ybˇersouboru, vˇcetnˇevytiˇstˇen´ıjm´enazadan´ehosouboru a cesty k nˇemu.

• pack.py – Pˇr´ıkladpr´aces rozloˇzen´ımpomoc´ıbal´ıˇcku(pack), vych´azej´ıc´ı z Hello world!“ pˇr´ıkladu. ” 46 6.3. Zhodnocen´ıdle kvantifik´ator˚u

6.3 Zhodnocen´ıdle kvantifik´ator˚u

Pro zhodnocen´ı´uspˇeˇsnostinavrˇzen´ehomapov´an´ıa jeho implementace jsem navrhl kvantifik´atorydle sekce 4.2. Otestov´an´ıs aplikac´ıIDLE se nezdaˇrilo, ovˇsemtyto kvantifik´atoryje st´ale moˇzn´ezhodnotit:

• Implementovan´e tˇr´ıdy (widgety) – Implementoval jsem vˇetˇsinu tˇr´ıd z Tkinteru, vˇcetnˇenˇekolika z ttk. Pokud by bylo tˇreba nˇejakou pˇridat, je moˇzn´epodporovan´etˇr´ıdy pˇridatdo slovn´ıku translate class dict jednoduch´ymzp˚usovbem v r´amcizdrojov´ehosouboru Implementer dle 6.3.

• Vychoz´ ´ı parametry – Z v´ychoz´ıch parametr˚uwidget˚uz Tkinteru jsem implementoval jen nˇekter´e.Tyto parametry je ale moˇzn´evelice jednoduˇse rozˇs´ıˇritdle 5.9.

• Speci´aln´ı parametry – Ze speci´aln´ıch parametr˚ujsem implementoval tak´ejen nˇekter´e.Rozˇs´ıˇren´ıje opˇetmoˇzn´edle 5.9.

• Funkcionality – Z hlavn´ıch funkcionalit Tkinteru jsem implementoval nˇekolik z nich:

– Zavedl jsem podporu pro nˇekolik widget˚u,vˇcetnˇepodpory nab´ıdky. – Qtinter umoˇzˇnujepr´acis ud´alostmi,na ´urovni spojen´ıs instanc´ı a aplikac´ı,vˇcetnˇenav´az´an´ıa pˇrekladumezi ud´alostmiz Qt do Tk pro jejich dalˇs´ıobsluhu v zaveden´ych funkc´ıch. – D´ıkytˇr´ıdˇe Layouter jsem dle 5.7 umoˇzniltakovou spr´avurozloˇzen´ı, kter´avych´az´ıze spr´avc˚ugeometrie z Tkinteru. – Umoˇzniljsem pouˇz´ıvat souborov´edialogy. – Mezi z´akladn´ımiwidgety je i podpora pro widget pro zobrazen´ı grafiky. – Vytvoˇriljsem prototyp pro pr´acis promˇenn´ymiz Tkinteru – kon- kr´etnˇepromˇennouˇretˇezce.Ostatn´ıby mohly b´ytimplementov´any podobnˇe. – Kromˇepˇrekladuz´akladn´ıch a speci´aln´ıch parametr˚ujsem navrhl moˇznostzform´atov´an´ıhodnot tˇechto parametr˚u.Vytvoˇriljsem tak moˇznost pˇrekladustylizace Tk widget˚una stylizaci pomoc´ıˇsablon v Qt. – Mezi v´yznaˇcn´efunkcionality, kter´e nebyly zpracov´any, patˇr´ıpod- pora dialog˚uz Tkinter modulu tkMessageBox a podpora pr´ace s p´ısmeny, z ˇc´asti tkinter.font, jelikoˇzjsem jim pˇriimplementaci nedal dostateˇcnouv´ahu. Napˇr´ıkladchybˇej´ıc´ıpodpora tkinter.font urˇcitˇem˚uˇzeza probl´emov´espuˇstˇen´ınastroje IDLE.

47 6. Testovan´ ´ı a zhodnocen´ı

• Rozˇsiˇritelnost – Cel´yn´astroj Qtinter jsem se snaˇzilnavrhnout tak, aby ho bylo moˇzn´ejednoduˇse rozˇs´ıˇrit, protoˇzejsem nepˇredpokl´ad´al,ˇze v r´amciimplementace budu schopn´yzaruˇcitplnohodnotnou podporu. V r´amciimplementace jsem vyuˇzilnebo doporuˇcilmechanismy, kter´eby rozˇsiˇritelnostimˇelydoc´ılit.Hlavn´ıs´ılurozˇsiˇritelnostisv´eimplementace vid´ımv mnoˇzstv´ıstruktur a slovn´ık˚u,kter´eumoˇzˇnuj´ıjednoduch´erozˇs´ıˇren´ı. Hlavn´ıˇc´astprogramu, tˇr´ıda Implementer je aˇzna vyj´ımkyvyjmenovan´e v algoritmu tˇr´ıdydle naps´anatak, aby nebrala v potaz konkr´etn´ıtˇr´ıdy nebo nastavovan´eatributy tˇechto tˇr´ıd,zpracov´av´aˇcistˇejen vstupn´ın-tice, pomoc´ıpˇreklad˚uze soubor˚us mapov´an´ındle 5.9. Moˇznostirozˇs´ıˇren´ı n´astroje Qtinter jsem popsal v dan´ych m´ıstech zdrojov´ehok´odu.

48 Z´avˇer

V teoretick´eˇc´astit´eto pr´acejsem provedl reˇserˇsik t´ematugrafick´ehouˇzivatelsk´e- ho rozhran´ı,zahrnuj´ıc´ıpopis sad n´astroj˚uTk, Qt a jejich moˇznostech vyuˇzit´ı v Pythonu v knihovnˇeTkinter nebo v bal´ıˇcc´ıch PyQt a PySide. Teoretickou ˇc´astjsem zakonˇcilshrnut´ımmotivace ke zpracov´an´ıt´ematu,kter´espoˇc´ıv´a umoˇznˇen´ıprovozu Tkinter aplikac´ıjako klient˚unejnovˇejˇs´ıch spr´avc˚uobrazovky na modern´ıch display´ıch. V r´amcipraktick´eˇc´ast´ısv´epr´acejsem analyzoval knihovnu Tkinter a bal´ıˇckyPyQt a PySide podrobnˇeji,popsal jsem jejich d˚uleˇzit´emechanismy a vz´ajemnˇeje srovnal. Na z´akladˇeproveden´eanal´yzyjsem navrhl moˇznosti mapov´an´ıa navrhl pro realizaci to, kter´esplˇnovalo definovan´akrit´eria.Abych mohl zhodnotit implementovan´yprototyp zvolen´eho mapov´an´ı,navrhl jsem hodnot´ıc´ıkvantifik´atory. V r´amcirealizace jsem zvolen´epro zvolen´emapov´an´ıimplementoval proto- typ podporuj´ıc´ınejd˚uleˇzitˇejˇs´ıfunkce rozhran´ıTkinteru. Pˇrikonstrukci tohoto prototypu jsem dbal na to, aby bylo moˇzn´eho jednoduˇserozˇs´ıˇrit,coˇzse osvˇedˇcilopˇritestov´an´ıs re´aln´ymiaplikacemi. Zp˚usobrozˇs´ıˇren´ıje v pr´aci n´aleˇzitˇepops´anvˇcetnˇeuk´azek. Implementovan´yprototyp obsahuje podporu vˇetˇsiny z´akladn´ıch prvk˚u Tkinteru s jejich nastaven´ımi, podporu ud´alost´ı, r˚uzn´ych zp˚usob˚utvorby rozloˇzen´ıa dialog˚u.Avˇsakani s takto pokroˇcil´ymprototypem nebylo moˇzn´e vyuˇz´ıtimplementovan´ehon´astroje pro aplikaci IDLE. Pro ´uˇcelyprezentace funkc´ıimplementovan´ehon´astroje jsou v pr´aciuvedeny funkˇcn´ıpˇr´ıkladypouˇzit´ı, kter´yvych´az´ız jednoduch´yaplikac´ıa pro vyuˇzit´ıimplementovan´ehoprototypu potˇrebuj´ıpouze zmˇenitimportovan´ymodul. Pˇr´ınossv´epr´acevn´ım´amv n´avrhu vhodn´ehomapov´an´ı,kter´eumoˇznilo jednoduch´ymaplikac´ım v Tkinteru vyuˇz´ıvat Qt komponenty, a kter´eje moˇzn´e jednoduˇserozˇs´ıˇrit´upravou, kter´anevyˇzadujeznalost vnitˇrn´ıimplementace n´astroje. Prototyp byl vyd´anpod svobodnou permisivn´ılicenc´ıa m˚uˇzetak b´ytvolnˇeˇs´ıˇrena upravov´ank plnohodnotn´emu n´astroji.

49

Literatura

[1] Daryl Harms, K. M.: Zaˇc´ın´ameprogramovat v jazyce Python. Brno: Com- puter Press, a.s., druh´evyd´an´ı,2008, ISBN 978-80-251-2161-0, 3-14, 27 s.

[2] Martinez, W. L.: Graphical user interfaces. WIREs Computational Statis- tics, roˇcn´ık3, ˇc.2, 2011: s. 119–133, doi:https://doi.org/10.1002/wics.150, [Online; cit. 2021-02-14], https://onlinelibrary.wiley.com/doi/pdf/ 10.1002/wics.150. Dostupn´e z: https://onlinelibrary.wiley.com/ doi/abs/10.1002/wics.150

[3] Wikipedia contributors: Graphical user interface. 2004, [Online; cit. 2021- 02-14]. Dostupn´ez: https://en.wikipedia.org/wiki/Graphical_user_ interface

[4] Wikipedia contributors: Widget toolkit. 2005, [Online; cit. 2021-02-14]. Dostupn´ez: https://en.wikipedia.org/wiki/Widget_toolkit

[5] Brad Myers, R. P., Scott E. Hudson: Past, Present and Future of User Interface Software Tools. Carnegie Mellon University, 2000, [Online; cit. 2021-02-14]. Dostupn´ez: https://www.cs.cmu.edu/˜amulet/papers/ futureofhciACM.pdf

[6] Python Software Foundation: tkinter — Python interface to Tcl/Tk. [online], 2001, [Online; cit. 2021-02-14]. Dostupn´e z: https:// docs.python.org/3/library/tkinter.html

[7] Tcl Developer Xchange: Language. [Online; cit. 2021-05-04]. Dostupn´ez: http://www.tcl.tk/about/language.html

[8] Tcl Developer Xchange: Uses for Tcl/Tk. [Online; cit. 2021-05-04]. Do- stupn´ez: http://www.tcl.tk/about/uses.html

51 Literatura

[9] The Qt Company: Legal — Licensing - Qt. [Online; cit. 2021-05-05]. Dostupn´ez: https://www.qt.io/licensing/ [10] Thelin, J.: Foundations of Qt Development. Apress, 2007, ISBN 978-1- 59059-831-3. [11] Riverbank Computing Limited: What is PyQt? [online], [Online; cit. 2021- 02-14]. Dostupn´ez: https://riverbankcomputing.com/software/pyqt/ intro [12] Riverbank Computing Limited: What is SIP? [online], [Online; cit. 2021- 02-14]. Dostupn´ez: https://www.riverbankcomputing.com/software/ sip/intro [13] PySide Team: PySide. [online], [Online; cit. 2021-02-14]. Dostupn´ez: https://pypi.org/project/PySide/ [14] The Qt Company Ltd.: Shiboken. [online], [Online; cit. 2021-02-14]. Do- stupn´ez: https://doc.qt.io/qtforpython/shiboken6/ [15] Qt Wiki: Differences Between PySide and PyQt. [Online; cit. 2021-05-04]. Dostupn´ez: https://wiki.qt.io/Differences_Between_PySide_and_ PyQt [16] The Spyder Development Team: QtPy: Abstraction layer for PyQt5/PyQt4/PySide2/PySide. [Online; cit. 2021-05-04]. Dostupn´ez: https://github.com/spyder-ide/qtpy [17] Tcl Developer Xchange: Tcl/Tk Licensing Terms. [online], [Online; cit. 2021-05-05]. Dostupn´e z: http://www.tcl.tk/software/tcltk/ license.html [18] Johan Helsing: Creating devices with multiple UI proces- ses using Wayland. [Online; cit. 2021-05-05]. Dostupn´e z: https://www.qt.io/blog/2017/01/23/creating-devices-with- multiple-ui-processes-using-wayland [19] Wikipedia contributors: Wayland (display server protocol) — Wi- kipedia, The Free Encyclopedia. 2021, [Online; cit. 2021-05-05]. Dostupn´ez: https://en.wikipedia.org/w/index.php?title=Wayland_ (display_server_protocol)&oldid=1018059209 [20] Tcl Developer Xchange: Binary Distributions. [Online; cit. 2021-05-05]. Dostupn´ez: https://wiki.tcl-lang.org/page/Binary+Distributions [21] Jiˇr´ı Eischmann: HiDPI v Linuxu: podpora se zlepˇsuje, kaz´ı ji star´e aplikace a frameworky. [Online; cit. 2021-05-06]. Do- stupn´ez: https://www.root.cz/clanky/hidpi-v-linuxu-podpora-se- zlepsuje-kazi-ji-stare-aplikace-a-frameworky/

52 Literatura

[22] John W. Shipman: Layout management. [Online; cit. 2021-05- 05]. Dostupn´ez: https://anzeljg.github.io/rin2/book2/2405/docs/ tkinter/layout-mgt.html

[23] , Inc.: Tcl8.6.11/Tk8.6.11 Documentation. [Online; cit. 2021-05-05]. Dostupn´e z: http://www.tcl.tk/man/tcl8.6/TkCmd/ pack.htm

[24] John W. Shipman: Tkinter 8.5 reference: a GUI for Python. [online], [Online; cit. 2021-05-05]. Dostupn´ez: https://anzeljg.github.io/rin2/ book2/2405/docs/tkinter/index.html

[25] John W. Shipman: Tkinter 8.5 reference: a GUI for Python. [Online; cit. 2021-05-05]. Dostupn´ez: https://anzeljg.github.io/rin2/book2/ 2405/docs/tkinter/events.html

[26] John W. Shipman: Themed widgets. [Online; cit. 2021-05-05]. Dostupn´e z: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ ttk.html

[27] John W. Shipman: The tkMessageBox dialogs module. [Online; cit. 2021- 05-05]. Dostupn´e z: https://anzeljg.github.io/rin2/book2/2405/ docs/tkinter/tkMessageBox.html

[28] John W. Shipman: The tkMessageBox dialogs module. [Online; cit. 2021- 05-05]. Dostupn´e z: https://anzeljg.github.io/rin2/book2/2405/ docs/tkinter/tkFileDialog.html

[29] Riverbank Computing Limited: Modules. [online], [Online; cit. 2021-05- 05]. Dostupn´ez: https://www.riverbankcomputing.com/static/Docs/ PyQt5/module_index.html

[30] Riverbank Computing Limited: QtCore. [Online; cit. 2021-05-05]. Do- stupn´ez: https://www.riverbankcomputing.com/static/Docs/PyQt5/ /qtcore/qtcore-module.html

[31] Riverbank Computing Limited: Qt Class Reference. [Online; cit. 2021-05- 05]. Dostupn´ez: https://www.riverbankcomputing.com/static/Docs/ PyQt5/api/qtcore/qt.html

[32] Riverbank Computing Limited: PyQt Reference Guide. [Online; cit. 2021- 05-05]. Dostupn´ez: https://doc.bccnsoft.com/docs/PyQt4/qt.html

[33] Riverbank Computing Limited: QtGui. [Online; cit. 2021-05-05]. Do- stupn´ez: https://www.riverbankcomputing.com/static/Docs/PyQt5/ api/qtgui/qtgui-module.html

53 Literatura

[34] Riverbank Computing Limited: QWidget. [Online; cit. 2021-05-05]. Do- stupn´ez: https://www.riverbankcomputing.com/static/Docs/PyQt5/ api/qtcore/qtcore-module.html

[35] The Qt Company Ltd.: Qt Style Sheets. [Online; cit. 2021-05-05]. Dostupn´e z: https://doc.qt.io/qt-5/stylesheet.html

[36] The Qt Company Ltd.: Layout Management. [Online; cit. 2021-05-05]. Dostupn´ez: https://doc.qt.io/qt-5/layout.html

[37] Riverbank Computing Limited: QDialog. [Online; cit. 2021-05-05]. Do- stupn´ez: https://www.riverbankcomputing.com/static/Docs/PyQt5/ api/qtwidgets/qdialog.html

[38] Roger E. Critchlow Jr.: Tk Built-In Commands - keysyms. [Online; cit. 2021-05-06]. Dostupn´e z: http://www.tcl.tk/man/tcl8.4/TkCmd/ keysyms.htm

[39] openSUSE: openQA Tutorial. [Youtube; cit. 2021-05-06]. Dostupn´ez: https://www.youtube.com/watch?v=2zwU9_bV_zI

54 Prˇ´ıloha A

Seznam pouˇzit´ychzkratek

GUI Graphical user interface

CLI Command line interface

HID Human Interface Device

PSFL Python Software Foundation Licence

IDLE Integrated DeveLopment Environment

MFC The Microsoft Foundation Classes

WTL The

OWL The

VCL The

WYSIWYG What You See Is What You Get

OSS Open Source Software

LGPL GNU Lesser General Public License

GPL GNU General Public License

I/O Input/Output – Vstupn´ıa v´ystupn´ıoperace

TDBC Tcl Connectivity Interface

CSS Cascading Style Sheets

RGB Red, Green, Blue – definice barvy pomoc´ıaditivn´ıhomodelu

SDL2 Simple DirectMedia Layer

GSoC Google Summer of Code

55 A. Seznam pouˇzitych´ zkratek

API Application Programming

QWS Qt Window System

OCR Optical Character Recognition

56 Prˇ´ıloha B

Obsah pˇriloˇzen´ehoCD

readme.txt ...... struˇcn´ypopis obsahu CD src impl...... zdrojov´ek´odyimplementace thesis ...... zdrojov´aforma pr´aceve form´atuLATEX text ...... text pr´ace DP Schuh Matˇej 2021.tex ...... text pr´aceve form´atuPDF

57