Tkinter
Label Widget
Label je v Tkinteru název třídy, jejíž instance se používá k zobrazení textu nebo obrázku.
Sotva existuje kniha nebo úvod do programovacího jazyka, který by nezačal s příkladem "Hello World". Budeme se držet tradice ale lehce upravíme výstup na "Hello Tkinter".
Následující skript používá Tkinter k vytvoření okna s textem "Hello Tkinter". Můžete použít překladače Pythonu pro zadání kódu řádek po řádku nebo jej můžete uložit do souboru, např. "tk_hello.py":
from tkinter import * root = Tk() w = Label(root, text="Hello Tkinter!") w.pack() root.mainloop()
Spuštění našeho příkladu
Uložíme-li skript do souboru, můžeme jej spustit z příkazového řádku takto:$ python33 tk_hello.py
Okno v Linuxu s Gnome vypadá takto:
Ve Windows převezme okno motiv Windows:
Vysvětlení
Modul Tkinter, který obsahuje knihovnu Tk, musí být vždy importován. V našem příkladě importujeme z Tkinteru všechno ("*") do jmenného prostoru našeho modulu:from tkinter import *Pro aktivaci Tkinteru musíme vytvořit kořenový (root) widget třídy Tk, což je okno s titulkovou lištou a dalším vybavením, doplněným správcem okna. Kořenový (top-level) widget musí být vytvořen před všemi ostatními widgety a v aplikaci může být jenom jeden.
root = Tk()Následující řádek obsahuje widget odvozený od třídy Label. První parametr tvorby instance je název nadřazeného (parent) okna, v našem případě "root". Náš widget (w) je tedy potomkem kořenového widgetu. Klíčový (keyword) parametr "text" určuje text, který má být zobrazen:
w = Label(root, text="Hello Tkinter!")Konfigurační metoda pack napovídá Tk aby přizpůsobil velikost okna velikosti daného textu.
w.pack()Okno se zobrazí až poté, co vložíme smyčku událostí Tkinteru:
root.mainloop()Náš skript zůstane pod dohledem této smyčky událostí dokud nezavřeme okno.
Užití obrázků v popiscích
Jak jsme již uvedli, popisky (labels) mohou obsahovat text i obrázky. Následující příklad obsahuje dva popisky, jeden s textem a druhý s obrázkem.from tkinter import * root = Tk() logo = PhotoImage(file="../images/python_logo_small.gif") w1 = Label(root, image=logo).pack(side="right") explanation = """V současnosti jsou podporovány\n pouze formáty GIF a PPM/PGM.\n Existuje ale rozhraní, které umožňuje\n snadné vložení dalších formátů.""" w2 = Label(root, justify=LEFT, padx = 10, text=explanation).pack(side="left") root.mainloop()
Když tento skript spustíte, bude aplikace v Linuxovém desktopu s Gnome vypadat nějak takto:
Parametr "justify" lze použít pro zarovnání textu vlevo, vpravo, na střed (LEFT, RIGHT či CENTER). Parametr "padx" použijeme pro přidání dodatečné horizontální výstelky kolem textového popisku. Implicitní výstelka (padding) je 1 pixel. Pro vertikální výstelku existuje parametr "pady". Předchozí příklad bez "justify" (implicitní je střed) a "padx" vypadá takto:
Potřebujete text přecházející přes obrázek? Žádný problém! Vytvoříme pouze jeden popisek, u něhož zadáme text i obrázek současně. Implicitně se obrázek kreslí místo textu. Abychom dostali i text, musíme použít parametr "compound". Zadáme-li tomuto parametru hodnotu CENTER, vypíše se text přes obrázek:
from tkinter import * root = Tk() logo = PhotoImage(file="../images/python_logo_small.gif") explanation = """At present, only GIF and PPM/PGM\n formats are supported, but an interface\n exists to allow additional image file\n formats to be added easily.""" w = Label(root, compound = CENTER, text=explanation, image=logo).pack(side="right") root.mainloop()
Můžeme mít obrázek na pravé straně a text na levé s výstelkou 10 pixelů na levé a pravé straně následující změnou deklarace popisku:
w = Label(root, justify=LEFT, compound = LEFT, padx = 10, text=explanation, image=logo).pack(side="right")
Je-li parametr "compound" nastaven na BOTTOM, LEFT, RIGHT, či TOP, je obrázek následně kreslen pod, vlevo, vpravo či nad textem.
Barevné popisky s různými fonty
Některé widgety Tk, jako "label", "text" a "canvas" vám umožní určit font zadávaného textu. Toho se dosáhne zadáním atributu "font" prostřednictvím konfiguračního parametru font. Musíte vzít v úvahu, že fonty jsou jednou z několika oblastí, které nejsou nezávislé na platformě.Pro barevnou změnu textu použijeme u popisku atribut "fg" a pro barevnou změnu pozadí použijeme atribut "bg".
from tkinter import * root = Tk() Label(root, text="Red Text in Times Font", g="red", font="Times").pack() Label(root, text="Green Text in Helvetica Font", ¨ fg="light green", bg="dark green", font="Helvetica 16 bold italic").pack() Label(root, text="Blue Text in Verdana bold", fg="blue", bg="yellow", font="Verdana 10 bold").pack() root.mainloop()Všimněte si, že jsme instancím třídy Label nepřiřadili žádné názvy. Výsledek vypadá takto:
Dynamický obsah popisku
Následující skript vádí příklad, kde hodnota v popisku se dynamicky zvětšuje o 1, dokud se nestiskne tlačítko stop:import tkinter as tk counter = 0 def counter_label(label): def count(): global counter counter += 1 label.config(text=str(counter)) label.after(1000, count) count() root = tk.Tk() root.title("Counting Seconds") label = tk.Label(root, fg="green") label.pack() counter_label(label) button = tk.Button(root, text='Stop', width=25, command=root.destroy) button.pack() root.mainloop()Výsledek předchozího skriptu vypadá takto: