Tkinter

Label Widget

Hello Tkinter with Python
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:

Tk widgets

Ve Windows převezme okno motiv Windows:

Hello Tkinter 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:

Label with included image

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:

Label with included image

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()


Text on top of image in label

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:

Colored Labels with different fonts

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:

Dynamic content in Label