Obsah
1. Knihovny pro tvorbu grafického uživatelského rozhraní v Pythonu
12. PyjamasDesktop (pyjs Desktop)
13. Repositář s demonstračními příklady
1. Knihovny pro tvorbu grafického uživatelského rozhraní v Pythonu
Pro programovací jazyk Python, který pravděpodobně není nutné čtenářům tohoto serveru představovat, vzniklo poměrně velké množství knihoven i celých (mnohdy velmi rozsáhlých) frameworků určených pro tvorbu grafického uživatelského rozhraní. Jednotlivé knihovny se od sebe samozřejmě v mnoha směrech odlišují, ať již se to týká způsobu modelování grafického uživatelského rozhraní a specifikace reakcí na události vyvolané uživatelem, tak i tím, jaká (většinou nativní) knihovna jle použita pro vykreslování celých oken, dialogů i jednotlivých ovládacích prvků. Ve světě Linuxu se dnes setkáme především s nativními knihovnami GTK+ (použito zejména v desktopovém prostředí GNOME Shell) a Qt (použito v desktopovém prostředí KDE), ale nesmíme zapomenout ani na multiplatformní knihovnu pojmenovanou wxWidgets (dříve se nazývala wxWindows) nebo taktéž multiplatformní knihovnu Tk.
Relativně nedávno se pro Python objevily i zcela nové knihovny určené pro tvorbu GUI umožňující používat webové technologie (PyjamasDesktop) popř. mobilní platformy (Kivy). S jednotlivými GUI knihovnami se ve stručnosti seznámíme v dnešním článku, ve článcích navazujících se pak již budeme podrobněji věnovat vybraným knihovnám.
Poznámka: kromě zmíněného PyjamasDesktop a Kivy se budeme věnovat především knihovnám pro desktopové aplikace s GUI, i když pro Python existuje hned několik (možná i desítek) frameworků umožňujících vytvářet webové aplikace či aplikace typu Atom, tj. aplikace využívající webové technologie, ovšem „zabalené“ takovým způsobem, aby se jejich chování přiblížilo aplikacím desktopovým.
2. Tkinter
Popis první knihovny určené pro tvorbu GUI začneme poněkud zeširoka, protože pythonovská knihovna nazvaná Tkinter tvoří rozhraní ke knihovně Tk, přičemž Tk je takzvaný toolkit (z pohledu programovacího jazyka se přitom jedná o knihovnu) určený pro jednoduchý a rychlý vývoj programů obsahujících grafické uživatelské rozhraní. Autorem tohoto toolkitu je, podobně jako v případě programovacího jazyka Tcl, John Ousterhout, mezi jehož zájmy v minulosti patřila automatizace (skriptovatelnost) aplikací a právě tvorba grafických uživatelských rozhraní. V minulosti byl tento toolkit velmi oblíbený, proto se dodával (a stále dodává) spolu s instalací programovacího jazyka Tcl a – což nás dnes zajímá mnohem více – i s jazykem Python společně s rozhraním Tkinter. I z tohoto důvodu se také v různých materiálech a dokumentech často setkáme se společným názvem Tcl/Tk. Samotný název Tk jednoduše znamená zkratku slova ToolKit.
Důležitou vlastností knihovny Tk, která zůstala zachována i v Tkinteru, je úsporný, flexibilní a přitom čitelný zápis programu se specifikací ovládacích prvků, jejich umístění v oknech, vlastností i callback funkcí volaných v důsledku uživatelské činnosti. Udává se, že poměr psaného kódu v Tcl/Tk je vůči dnes již obstarožnímu a prakticky zapomenutému Motifu na hodnotách 1:20 a vůči základnímu Xlibu dokonce 1:100! (vše se samozřejmě týká tvorby grafického uživatelského rozhraní). Na tomto místě je však nutné podotknout, že Motif je z dnešního pohledu již zastaralá knihovna a navíc dnes mnoho moderních knihoven pro GUI podporuje deklaraci grafického uživatelského rozhraní v konfiguračních souborech, nikoli tedy programem (což má své výhody, ale samozřejmě i zápory). Nicméně i dnes představuje kombinace Tcl+Tk či ještě lépe Python+Tkinter poměrně dobrou volbu pro mnoho typů aplikací s GUI.
V průběhu postupného vývoje novějších (avšak ne nutně dokonalejších) programovacích nástrojů byla knihovna Tk kromě Tcl použita i v mnoha dalších programovacích jazycích. Pravděpodobně nejznámější je, Lsamozřejmě kromě samotné dvojice Tcl/Tk, modul určený pro programovací jazyk Perl (Perl/Tk) a Python (Tkinter – Tk Interface, což je téma navazujícího článku). Knihovnu Tk je však samozřejmě možné použít i v dalších programovacích jazycích, i když v mnoha případech ne tak snadně a efektivně, jako ze samotného Tcl. V praxi se často s výhodou používá či používalo spojení programů napsaných v programovacím jazyku C či s C++ s grafickým uživatelským rozhraním, které je vytvořeno pomocí Tcl a Tk.
S knihovnou Tkinter se blíže seznámíme v dalším pokračování tohoto článku, kde si uvedeme větší množství příkladů. Dnes si pouze pro ilustraci ukážeme, jak jednoduchá může být (značně primitivní) aplikace s jedním oknem a textovým návěštím umístěným do tohoto okna. Podobný příklad si posléze upravíme i pro některé další knihovny popsané v navazujících kapitolách:
#!/usr/bin/env python from tkinter import * root = Tk() label = Label(root, text="Hello world!") label.pack() root.mainloop()
Ve skutečnosti se však v současnosti používá takzvané TTk neboli Themed Tk) a program bude muset být nepatrně upraven (přidá se import a namísto Label() se zavolá konstruktor ttk.Label()):
#!/usr/bin/env python from tkinter import * from tkinter import ttk root = Tk() label = ttk.Label(root, text="Hello world!") label.pack() root.mainloop()
Poznámka: na Rootu již vyšel zajímavý článek o Tkinteru, v jehož rámci byla vytvořena jednoduchá hra typu Arkanoid/Breakout.
3. appJar
Nad rozhraním Tkinter zmíněným v předchozí kapitole je postaveno další programové rozhraní nazvané jednoduše appJar. Tvůrcem tohoto rozhraní je Richard Jarvis, který pracuje jako učitel. Richardovým cílem bylo navrhnout appJar takovým způsobem, aby byla programová tvorba grafického uživatelského rozhraní co nejjednodušší a aby tak bylo možné knihovnu appJar použít ve výuce. Tento cíl se skutečně podařilo splnit, takže v současnosti představuje appJar s velkou pravděpodobností ten nejrychlejší a současně i nejjednodušší způsob, jak v Pythonu vytvořit aplikaci s grafickým uživatelským rozhraním, i když je nutné poznamenat, že některé pokročilejší ovládací prvky nejsou k dispozici (některé nejsou k dispozici ani v původním Tkinteru). Navíc vlastně ani není nutné appJar instalovat, což je na školách obecně problematické, neboť to vyžaduje koordinaci učitele s administrátorem. Namísto instalace je pouze nutné z projektových stránek http://appjar.info/ stáhnout ZIP archiv a ten rozbalit do adresáře s projektem (a popřípadě nastavit .gitignore, aby se vzniklý podadresář neukládal do repositáře).
Demonstrační příklad, v němž se vytvoří okno obsahující textové návěští, bude při použití knihovny appJar ještě jednodušší a kratší, než tomu bylo výše zmíněné u knihovny Tkinter. Ostatně se můžete přesvědčit sami porovnáním obou zdrojových kódů – nyní se jedná o pouhé čtyři programové řádky:
#!/usr/bin/env python from appJar import gui app = gui() app.addLabel("title", "Hello world!") app.go()
Poznámka: úvodní řádek se shebangem je možné vynechat, pokud se bude skript spouštět přes interpret Pythonu.
4. PyGTK
Další knihovnou určenou pro tvorbu grafického uživatelského prostředí v programovacím jazyku Python, s níž se dnes alespoň ve stručnosti seznámíme, je knihovna nazvaná PyGTK. Název této knihovny již velmi přesně prozrazuje, že je určena pro desktopová prostředí založená na GTK+, konkrétně ovšem na GTK+ 2.x. Jedná se tedy o dnes již poněkud zastaralou knihovnu, která se však stále používá, a to zejména u aplikací portovaných na operační systémy Microsoft Windows. Pokud budete potřebovat vytvořit grafické uživatelské rozhraní pro desktopová prostředí založená na novější GTK+ 3.x, použijte raději dále zmíněnou knihovnu nazvanou PyGObject. S využitím PyGTK vzniklo relativně velké množství aplikací, například Gedit, Ubiquity, Gnome Software Center, Gajim, starší verze PyChess, OpenEV apod. Tyto aplikace jsou nebo budou upraveny takovým způsobem, aby využily novější knihovnu PyGObject.
Demonstrační příklad, který po svém spuštění otevře okno a v něm vykreslí textové návěští, bude při použití knihovny PyGTK vypadat následovně:
import pygtk pygtk.require('2.0') import gtk def delete_event(widget, event, data=None): print "delete event occurred" return False def destroy(widget, data=None): print "destroy signal occurred" gtk.main_quit() window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("delete_event", delete_event) window.connect("destroy", destroy) label = gtk.Label("Hello world!") window.add(label) label.show() window.show() gtk.main()
Povšimněte si, že se již jedná o relativně složitý kód, v němž se explicitně řeší způsob reakce na událost, která vznikne při zavírání okna. V předchozích knihovnách bylo toto chování stanoveno implicitně.
Pokud z aplikace odstraníme kód pro reakci na zavření okna, bude nutné aplikaci zastavit z příkazového řádku nebo oblíbeným příkazem xkill:
import pygtk pygtk.require('2.0') import gtk window = gtk.Window(gtk.WINDOW_TOPLEVEL) label = gtk.Label("Hello world!") window.add(label) label.show() window.show() gtk.main()
5. PyGObject
Knihovna PyGtk, která byla zmíněná v předchozí kapitole, je postupně nahrazována novější knihovnou nazvanou PyGObject. Tato knihovna poskytuje programátorům používajícím jazyk Python rozhraní k nativní knihovně GObject využívané v systému GNOME. Díky tomu lze přímo z Pythonu pracovat nejenom s prvky grafického uživatelského rozhraní, ale i s GIO či s multimediálním frameworkem GStreamer. Mezi užitečné aplikace, které již dnes knihovnu PyGObject používají, patří například Meld, PyChess či video editor OpenShot. Seznam aplikací založených na PyGObjectu lze nalézt například na Wikipedii: https://en.wikipedia.org/wiki/Category:Software_that_uses_PyGObject. I knihovnou PyGObject se budeme podrobněji zabývat v navazujících článcích.
6. PyQt
Podobně jako knihovna PyGTK, která vývojářům zajišťovala rozhraní mezi programovacím jazykem Python a knihovnou GTK+, je tomu i u knihovny nazvané PyQt, samozřejmě ovšem s tím „nepatrným“ rozdílem, že PyQt představuje rozhraní pro Qt, která je používána (nejenom) v desktopovém prostředí KDE (ve skutečnosti se s Qt setkáme i iOS či Androidu). Ve skutečnosti však Qt není pouze knihovna určená pro tvorbu grafického uživatelského rozhraní, ale ucelený framework, což mj. znamená, že v PyQt mají vývojáři k dispozici rozhraní se zhruba 440 třídami a 6000 funkcemi i metodami, s jejichž využitím je možné vytvářet grafické uživatelské rozhraní (i s použitím deklarativního jazyka QML), používat známý widget QScintilla používaný v textových editorech a procesorech, pracovat s relačními databázemi, používat vektorový grafický formát SVG, pracovat se soubory XML apod.
Demonstrační příklad, který po svém spuštění vytvoří okno a umístí do něho textové návěští, se s využitím knihovny PyQt může napsat následujícím způsobem:
import sys # zajisteni importu noveho rozhrani import sip sip.setapi('QDate', 2) sip.setapi('QDateTime', 2) sip.setapi('QString', 2) sip.setapi('QTextStream', 2) sip.setapi('QTime', 2) sip.setapi('QUrl', 2) sip.setapi('QVariant', 2) from PyQt4.Qt import * qt_application = QApplication(sys.argv) label = QLabel('Hello world!') label.show() qt_application.exec_()
7. PySide
Druhá knihovna zajišťující rozhraní mezi Qt a Pythonem se jmenuje PySide. Jedná se vlastně o fork výše zmíněného rozhraní PyQt, ovšem PySide používá odlišné licencování, konkrétně licenci LGPL. Díky tomu lze PySide bez problémů použít jak v uzavřených komerčních aplikacích, tak i v open source programech. Opět si ukažme, jak by náš demonstrační příklad mohl vypadat, kdybychom pro grafické uživatelské rozhraní použili knihovnu PySide:
import sys from PySide.QtCore import * from PySide.QtGui import * qt_application = QApplication(sys.argv) label = QLabel('Hello world!') label.show() qt_application.exec_()
import sys from PySide.QtCore import * from PySide.QtGui import * qt_application = QApplication(sys.argv) class HelloWorldLabel(QLabel): def __init__(self): QLabel.__init__(self, "Hello world!") self.setMinimumSize(QSize(600, 400)) self.setAlignment(Qt.AlignCenter) self.setWindowTitle('Hello world!') def run(self): self.show() qt_application.exec_() HelloWorldLabel().run()
I touto knihovnou se budeme podrobněji zabývat v dalších pokračováních tohoto článku.
8. wxPython
Další knihovnou určenou pro tvorbu grafického uživatelského rozhraní v Pythonu, je knihovna nazvaná wxPython, která zajišťuje rozhraní k populární GUI knihovně wxWidgets (možná ji znáte ještě pod starším jménem wxWindows, ovšem autor byl v roce 2004 společností Microsoft v podstatě donucen k přejmenování). Díky existenci knihovny wxPython je možné tvořit multiplatformní aplikace, které lze bez nutnosti dalších úprav používat jak na Linuxu, tak i na Mac OS X, Microsoft Windows (od XP do Windows 10), ale i na AmigaOS (prozatím v beta fázi). Navíc se jedná o stabilní a relativně snadno použitelnou knihovnu; ostatně i Guido van Rossum, tedy autor programovacího jazyka Python, prohlásil: „wxPython is the best and most mature cross-platform GUI toolkit, given a number of constraints. The only reason wxPython isn't the standard Python GUI toolkit is that Tkinter was there first.“. Kromě wxPython existuje ke knihovně wxWidgets rozhraní pro mnoho dalších jazyků, což jen svědčí o její popularitě.
9. Wax
Jen krátce se zmíním o knihovně Wax, která ovšem v současnosti není aktivně vyvíjena – její poslední verze byla vydána již v roce 2006. Tato knihovna je postavena nad wxPython a měla sloužit ke zjednodušení tvorby GUI. Navíc mělo být celé rozhraní více „pythonovské“, protože u wxPython je patrné, že wxWidgets je knihovna primárně určená pro programovací jazyk C++ a nikoli pro Python.
10. Kivy
Další knihovnou pro tvorbu grafického uživatelského prostředí, s níž se dnes alespoň ve stručnosti seznámíme, je knihovna nazvaná Kivy. Jedná se vlastně o ucelenou platformu určenou především pro tvorbu aplikací pro mobilní platformy, tedy pro Android a iOS. Ve skutečnosti je ale možné Kivy použít i na běžných desktopech s operačními systémy Mac OS X, Microsoft Windows a samozřejmě (a to v neposlední řadě) i s Linuxem. V tomto případě však nebudou k dispozici všechny možnosti ovládání, především rozhraní multitouch určené primárně pro dotykové obrazovky. Už z této poznámky je asi zřejmé, že se Kivy bude v mnoha ohledech odlišovat od všech výše uvedených knihoven a frameworků, které jsou určeny především pro běžné desktopy ovládané kombinací klávesnice a myši. Kivy však jde ještě dále, protože programátorům nabízí prakticky všechny technologie, které jsou pro moderní GUI aplikace vyžadovány. A protože se jedná o knihovnu určenou především pro mobilní zařízení, je podporována i OpenGL ES 2, takže vykreslování ovládacích prvků je akcelerováno. Navíc je možné pro deklaraci GUI použít speciální jazyk nazvaný Kv, který zde hraje podobnou roli jako například QML (Qt Modeling Language).
Opět se podívejme na to, jak by mohl vypadat příklad s oknem (plochou), do něhož je umístěno jednoduché textové návěští. Celá aplikace se skládá z jediné třídy obsahující v našem případě jedinou funkci vytvářející textové návěští. Chování aplikace je v tomto případě řízeno implicitními pravidly:
from kivy.app import App from kivy.uix.label import Label class TestApp(App): def build(self): return Label(text='Hello World') TestApp().run()
Touto velmi zajímavou knihovnou se budeme podrobněji zabývat v dalších částech seriálu.
11. Pyforms
Pyforms je poměrně zajímavá knihovna, která umožňuje tvorbu aplikací jak s klasickým „desktopovým“ grafickým uživatelským rozhraním, tak i s rozhraním webovým a navíc s volitelným terminálem. Pyforms lze samozřejmě používat na Linuxu, ale i na Mac OS X i na Microsoft Windows, a to mj. i díky tomu, že se pro samotné GUI využívá nativní knihovna Qt a interně se používají třídy z PyQt.
12. PyjamasDesktop (pyjs Desktop)
Projekt nazvaný PyjamasDesktop vznikl z projektu Pyjamas, který možná čtenáři tohoto článku znají. Tento projekt zajišťuje, aby se webová aplikace naprogramovaná v Pythonu mohla spouštět podobně jako běžná desktopová aplikace, což je ostatně postup, který můžeme znát z mnoha úspěšných desktopových aplikací, například z textového editoru Atom založeného na frameworku Electron. Na rozdíl od většiny podobných knihoven, které primárně používají JavaScript, je ovšem Pyjamas i PyjamasDesktop zaměřen na Python, protože transkripce do JavaScriptu je prováděna automaticky a většinou bez vědomí programátora.
13. Repositář s demonstračními příklady
Zdrojové kódy všech demonstračních příkladů, v nichž se vytvořilo jednoduché GUI s oknem a textovým návěštím s použitím různých knihoven a frameworků, naleznete na následujících odkazech:
14. Odkazy na Internetu
- Hra Breakout napísaná v Tkinteri
https://www.root.cz/clanky/hra-breakout-napisana-v-tkinteri/ - The Hitchhiker's Guide to Pyhton: GUI Applications
http://docs.python-guide.org/en/latest/scenarios/gui/ - 7 Top Python GUI Frameworks for 2017
http://insights.dice.com/2014/11/26/5-top-python-guis-for-2015/ - GUI Programming in Python
https://wiki.python.org/moin/GuiProgramming - Cameron Laird's personal notes on Python GUIs
http://phaseit.net/claird/comp.lang.python/python_GUI.html - Python GUI development
http://pythoncentral.io/introduction-python-gui-development/ - Graphic User Interface FAQ
https://docs.python.org/2/faq/gui.html#graphic-user-interface-faq - TkInter
https://wiki.python.org/moin/TkInter - Tkinter 8.5 reference: a GUI for Python
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html - TkInter (Wikipedia)
https://en.wikipedia.org/wiki/Tkinter - appJar
http://appjar.info/ - appJar (Wikipedia)
https://en.wikipedia.org/wiki/AppJar - appJar na Pythonhosted
http://pythonhosted.org/appJar/ - Stránky projektu PyGTK
http://www.pygtk.org/ - PyGTK (Wikipedia)
https://cs.wikipedia.org/wiki/PyGTK - Stránky projektu PyGObject
https://wiki.gnome.org/Projects/PyGObject - Stránky projektu Kivy
https://kivy.org/#home - Stránky projektu PyQt
https://riverbankcomputing.com/software/pyqt/intro - PyQt (Wikipedia)
https://cs.wikipedia.org/wiki/PyGTK - Stránky projektu PySide
https://wiki.qt.io/PySide - PySide (Wikipedia)
https://en.wikipedia.org/wiki/PySide - Stránky projektu Kivy
https://kivy.org/#home - Kivy (framework, Wikipedia)
https://en.wikipedia.org/wiki/Kivy_(framework) - QML Applications
http://doc.qt.io/qt-5/qmlapplications.html - KDE
https://www.kde.org/ - Qt
https://www.qt.io/ - GNOME
https://en.wikipedia.org/wiki/GNOME - Category:Software that uses PyGTK
https://en.wikipedia.org/wiki/Category:Software_that_uses_PyGTK - Category:Software that uses PyGObject
https://en.wikipedia.org/wiki/Category:Software_that_uses_PyGObject - Category:Software that uses wxWidgets
https://en.wikipedia.org/wiki/Category:Software_that_uses_wxWidgets - GIO
https://developer.gnome.org/gio/stable/ - GStreamer
https://gstreamer.freedesktop.org/ - GStreamer (Wikipedia)
https://en.wikipedia.org/wiki/GStreamer - Wax Gui Toolkit
https://wiki.python.org/moin/Wax