Tkinter


Dialogy a okna se zprávou

Dialogues Tkinter poskytuje řadu dialogových a informačních oken, které mohou být použity pro zobrazení zprávy, varování či chyby, jakož i widgety pro výběr souborů a barev. Existují také dialogová okna, žádající uživatele o zadání řetězce, celého nebo desetinného čísla.

Pohleďme na typickou seanci GUI s dialogy a informačními okny. Můžeme začít tlačítkem, které dialog otevírá, jako je tlačítko "Quit" v následujícím okně:

Window with quit and answer button

Stisknutí tlačítka "quit" otevře ověřovací (verify) okno:

Verify Window

Předpokládejme, že chceme varovat uživatele, že tlačítko "quit" není ještě zavedeno. V tom případě můžeme použít varovnou zprávu pro uživatele, který stiskl tlačítko "yes":

Warning Dialoque

Pokud někdo zvolí tlačítko "No", otevře se informační okno se sdělením "Quit has been cancelled":

Message box

Vraťme se zpátky k našemu prvnímu dialogu s tlačítky "quit" a "answer". Není-li funkcionalita volby "Answer" zavedena, mohlo by být užitečné použít následující okno se zprávou o chybě:

Error Message box


Všech pět dialogových oken vytvoří tento skriptík:

from tkinter import *
from tkinter.messagebox import *

def answer():
    showerror("Answer", "Sorry, no answer available")

def callback():
    if askyesno('Verify', 'Really quit?'):
        showwarning('Yes', 'Not yet implemented')
    else:
        showinfo('No', 'Quit has been cancelled')

Button(text='Quit', command=callback).pack(fill=X)
Button(text='Answer', command=answer).pack(fill=X)
mainloop()
Zkuste si jednotlivá okénka opatřit českými texty.

Dialogová okna

Dialogová okna (message boxes) jsou poskytována modulem tkinter.messagebox, který je nutné importovat.

Modul tkinter.messagebox obsahuje následující funkce, které odpovídají jednotlivým dialogovým oknům:

V následující ukázce uvidíme evokaci dialogového okna změnou zatržítka prostřednictvím kontrolní proměnné:
from tkinter import*
from tkinter.messagebox import*

root = Tk()
cbox_val = IntVar() # The control variable

def cbox_clicked():
    if cbox_val.get() == 1:
        showinfo('HAL9000', 'evil module disabled')
    else:
        showwarning('HAL9000', 'evil module enabled')

cbox = Checkbutton(root, text='Disable homicidal computer',
                   variable=cbox_val, command=cbox_clicked)
cbox.pack()
root.mainloop()


Choosing a file

Dialog pro otevření souboru

Sotva existuje seriozní aplikace, která nepotřebuje číst ze souboru nebo do souboru zapisovat. Navíc taková aplikace může potřebovat výběr adresáře. Pro tyto účely má Tkinter k disposici modul tkinter.filedialog.
from tkinter import *
from tkinter.filedialog import askopenfilename      

def callback():
    name= askopenfilename() 
    print (name)
    
errmsg = 'Error!'
Button(text='Open', command=callback).pack(fill=X)
mainloop()


Výše uvedený kód vytvoří okno s jediným tlačítkem a nápisem "Open". Je-li tlačítko stlačeno, objeví se následující okno:

Choosing a file

Vzhled dialogu "open" závisí na GUI operačního systému. Uvedený příklad byl vytvořen s použitím prostředí gnome v Linuxovém desktopu. Spustíme-li stejný program ve Windows 7, vypadá takto:

Choosing a file the Windows 7 way

Výběr barvy

Jsou aplikace, ve kterých má mít uživatel možnost výběru různých barev. Tkinter poskytuje vyskakovací (pop-up) menu pro výběr barvy. Za tímto účelem musíme importovat modul tkinter.colorchooser a použít metodu askcolor:
result = tkintercolorchooser.askcolor ( color,
                             option=value, ...)
Stiskne-li uživatel tlačítko OK, vrátí metoda askcolor() dvojici hodnot, které jsou obě prezentací vybrané barvy, např. ((106, 150, 98), '#6a9662')
První hodnotou je entice (R,G,B) prezentující podíly RGB v dekadických číslech od 0 do 255. Druhou hodnotou je hexadecimální prezentace vybrané barvy.
Stiskne-li uživatel "Cancel", vrátí metoda entici (None,None).

Klíčové (keyword) parametry jsou:

color Tato proměnná se použije pro určení implicitní zobrazované barvy. Není-li barva určena, je počáteční barvou šedá.
title Text, přiřazený proměnné "title", se objeví v záhlaví vyskakovacího okna. Implicitní název je "Color".
parent Určí okno, nad kterým se vyskakovací okno objeví. Implicitně se objeví nad kořenovým oknem.


Podívejme se na příklad:
from tkinter import *
from tkinter.colorchooser import askcolor                  

def callback():
    result = askcolor(color="#6A9662", 
                      title = "Bernd's Colour Chooser") 
    print (result)
    
root = Tk()
Button(root, 
       text='Choose Color', 
       fg="darkgreen", 
       command=callback).pack(side=LEFT, padx=10)
Button(text='Quit', 
       command=root.quit,
       fg="red").pack(side=LEFT, padx=10)
mainloop()
Vzhled závisí na operačním systému (Linux či Windows) a na zvoleném GUI (GNOME, KDE a pod). Následující okno se vynoří, použijete-li Gnome:

Choosing a Colour Startmenu

Choosing a Colour with Tkinter and Python

Použití totožného skriptu ve Windows 7 dává následující výsledek:

Choosing a Colour the Windows 7 way