Dnes to bude něco o grafickém prostředí neboli GUI neboli oknech. Aneb jak z Pythonu dostat, aby se moje aplikace otevřela v běžném okně na Linuxu, Windows i Macu, místo toho, aby se otevírala v černém shellovském okně.
Trocha teorie
Většina začínajících programátorů přímo omdlévá když zjistí, že musí začínat programování na černém příkazovém řádku, se kterým se nikdy ve Windows nesetkala. Maximálně u starých her nebo u chybových hlášek! Na druhou stranu zase existují začínající, kterým naopak imponuje, když mohou něco tvořit tím, že píšou (a neklikají) a černou obrazovku milují, protože v oknech dnes přeci "už umí každý!" Mě osobně více vyhovuje, když program dobře funguje než když dobře vypadá. Snad proto jsem začal v tomto kurzu s okny v Pythonu až tak pozdě.
Velký výběr
Pro začátečníka může být matoucí, že Python má na výběr ohromné množství grafických prostředí (= modulů), ve kterých můžete tvořit okna. To je situace naprosto odlišná od Delphi nebo VB. Tam prostě máte jedno prostředí a v tom tvoříte. V Pythonu jich je spousty: Tkinter, wxPython, GTK, Qt, FLTK, EasyGUI, Pygame...
Které zvolit? Podle mého soudu je pro začátečníky nejvhodnější Tkinter. Jeho výhodou je, že je přibalený k instalaci, je v něm vytvořena spousta modulů a aplikací (například prostředí IDLE). Chci-li být upřímný, musím dodat i nevýhody - nižší podpora nejnovějších okenních technologií a vychytávek. Ale nám jde o základy, ne o specialitky. Ať zvolíte jakékoliv a budete-li chtít tvořit více, než je v tomto kurzu, bez angličtiny to nepůjde. Ostatně i já jsem s angličtinou začínal tak, že jsem si slovo po slovu překládal manuály a příručky k programům, které jsem potřeboval. Rozhodně to není ztracený čas a doporučuji vám to. Českých příruček a tutoriálů ke grafickým prostředí v Pythonu je jako šafránu. Nejvíce má snad Tkinter, přesto je to dost málo ve srovnání s konkurencí :-(.
Klikajícího programátora také zaskočí, že v Tkinter si okno nenaklikám, jako třeba ve VB nebo Delphi. V něm se vše píše ručně. Já osobně si myslím, že to je částečně výhoda, protože tak má člověk šanci pochopit celé pozadí tvorby oken, mít ho plně pod kontrolou a rozumět každému každičkému řádku ve svojí aplikaci. Klikající prostředí v sobě mají např. Gtk nebo wxPython.
Tkinter
Tak jestli jste dočetli až sem a nevzdali jste to, gratuluji. Všechno má svoje výhody a nevýhody, co se dá dělat.
Tkinter je tedy standardní grafické rozhraní ke grafickému uživatelskému prostředí Tk. V současnosti má verzi 8.4. Chcete-li s ním pracovat, musíte ho nejdříve do svého scriptu naimportovat pomocí import Tkinter nebo from Tkinter import *. Tato druhá forma se obecně nedoporučuje až na pár výjimek, a tou jednou jsou právě grafická prostředí.
Ahoj světe!
Konec řečí, jdeme na to. Vyzkoušejte následující:
# -*- coding: utf-8 -*-
from Tkinter import *
root = Tk()
w = Label(root, text=u"Ahoj světe!")
w.pack()
root.mainloop()
print "Konec"
U výše uvedeného kódu si dejte pozor na kódování češtiny . Nestačí, že je zde uvedeno utf-8, vy musíte, po překopírování kodu do vašeho editoru, toto kódování také nastavit v editoru.
Detaily
Čeština
Ukázku kódu začínáme definováním češtiny. Přesto, že můžete používat jakékoliv kódování, doporučuji zůstávat u utf-8, které se jeví jako nejvíce progresivní. Při tomto způsobu se ani nemusí psát u řetězců to 'u', které je jinak povinné. Pozor, ať to máte v tom kódování také uloženo, jinak čeština nefunguje ...
# -*- coding: utf-8 -*- .
import
Následuje importování samotného grafického prostředí GUI. V něm jsou obsaženy všechny funkce, které potřebujeme k vytváření oken, menu, obrázků a všech akcí (reakce na události), které s nimi pak můžeme dělat.
from Tkinter import *
Inicializace hlavního okna
Další řádek - je inicializace Tkinter, kde vytváříme hlavní okno v Tkinter. Oknu (a dalším věcem v GUI) říkáme obecně widget (česky snad udělátko).
root = Tk()
Widget neboli udělátko
Slovem udělátko (v angličtině widget) rozumějte jakýkoliv grafický prvek na obrazovce - tedy třeba jakýkoliv text v okně, jakékoliv tlačítko, menu, obrázek v okně, oblast, kde můžete v okně psát, a také samotné okno. To vše je udělátko. Hlavní okno je normální okno s titulkem a dalšími prvky, které tam dodává váš systém, jako např. Minimalizace, Maximalizace, Zavřít, Stavový řádek,včetně barvy, umístnění, apod.
Label
Dále vytvoříme udělátko jménem Label (štítek) jako potomka okna root.
w = Label(root, text="Ahoj světe!")
w.pack()
Udělátko Label umí zobrazit v okně text nebo ikonu nebo jiný obrázek. V tomto případě používáme argument "text", abychom určili, jaký že to text se má zobrazit.
pack
Dále zavoláme k tomuto udělátku metodu pack(). Ta zabezpečí, aby okno bylo veliké akorát na náš text a zviditelní ho.
Hlavní smyčka mainloop
Nicméně, okno se nezobrazí dokud nevstoupíme do smyčky událostí Tkinter. Program zůstane v hlavní smyčce (mainloop) dokud okno nezavřeme. Hlavní smyčka událostí neobsluhuje pouze události od uživatele (jako například klik myší nebo zmáčknutí klávesy), ale také události od systému i samotného Tkinteru. Mezi nimi je také například metoda pack() a aktualizace okna. To kromě jiného znamená, že okno aplikace se nezobrazí, dokud do této hlavní smyčky nevstoupíme.root.mainloop()
Konec
Teprve když okno zavřeme, vypíše se "Konec".
Úkol
Úkol se netýká gui ani nebudete potřebovat nějaké nové funkce, spíše chytře použít staré známé cykly, podmínky, seznamy a hlavu. Takový malý programátorský hlavolam :-).
Zadání: Je dána posloupnost 50 čísel, z nichž některá mohou být stejná. Určete, která všechna čísla se v posloupnosti nachází.
Návod: Vygenerujte posloupnost (= seznam) 50 náhodných čísel třeba od 1 do 40. Tuto posloupnost procházejte a do nového výsledného seznamu číslo přidejte jen tehdy, pokud ono v ní ještě není. Způsob řešení může být i jiný...
Příklad: Z posloupnosti 5,3,5,4,4,4,7,2 by se mělo vytisknout 5,3,4,7,2.