Úvod do Tkinter - Okna pro jazyk Python - Postavené na základech 'An Introduction to Tkinter'

Základní části oken

Hlavní okno
Menu
Nástrojová lišta
Stavový řádek

Hlavní (základní) okno

V následujícím jednoduchém příkladě je na obrazovce jen jediné okno - hlavní okno. To se vytváří automaticky, když voláte konstruktor Tk:

from Tkinter import *

hlavni = Tk()
    
# vytvořit obsah okna jako potomky hlavního
    
hlavni.mainloop()

Potřebujete-li vytvořit další podokna hlavního, můžete to udělat pomocí udělátka Toplevel. To jednoduše vytvoří na obrazovce nové okno, které vypadá a chová se velmi stejně jako okno hlavní:

from Tkinter import *
    
hlavni = Tk()
    
# vytvořit obsah hlavního okna ...
    
top = Toplevel()
    
# vytvořit obsah okna top...
    
hlavni.mainloop()

Není třeba používat pack na zobrazování okna Toplevel, protože je zobrazováno automaticky správcem rozmístění. Ve skutečnosti dostanete chybu, pokud se pokusíte zapakovat udělátko Toplevel.

Menu

Tkinter nabízí na menu speciální udělátko. Chcete-li vytvořit menu, použijte jednoduše třídu Menu a pomocí metody add, do ní přidávejte položky.

Příklad:

Vytvoření malého menu

# -*- coding: utf-8 -*- 
from Tkinter import *

def volanafunkce():
    print u"zde je tělo volané funkce"

hlavni = Tk()

nabidka = Menu(hlavni)
hlavni.config(menu=nabidka)

menuSoubor = Menu(nabidka)
nabidka.add_cascade(label="Soubor", menu=menuSoubor)
menuSoubor.add_command(label=u"Nový", command=volanafunkce)
menuSoubor.add_command(label=u"Otevřít", command=volanafunkce)
menuSoubor.add_separator()
menuSoubor.add_command(label="Konec", command=volanafunkce)

helpMenu = Menu(nabidka)
nabidka.add_cascade(label=u"Nápověda", menu=helpMenu)
helpMenu.add_command(label=u"O aplikaci", command=volanafunkce)

mainloop()

V tomto příkladě začínáme vytvořením instance Menu nabidka, a pak jí připojíme k hlavnímu oknu metodou config. Obsah tohoto menu se zobrazí na vrchu hlavního okna. Menu nemusíte balit, je zobrazována automaticky.

Pak vytvoříme menuSoubor, jako potomka nabidky, a použijeme metodu add_cascade na vytvoření rozbalovacího menu. Pak již jen pomocí add_command přidáváme položky do menu a používáme add_separator na oddělení skupin položek.

Nápovědu vytvoříme velmi podobným způsobem.

Nástrojová lišta

Mnoho aplikací má tzv. nástrojovou lištu hned pod menu, která obvykle obsahuje několik tlačítek pro běžné funkce jako otevřít, tisk, zpět, apod.

V následujícím příkladě použijeme udělátko Frame jako základnu pro lištu a jednotlivá tlačítka budeme pakovat v něm.

Vytvoření jednoduché lišty

# -*- coding: UTF-8 -*-
from Tkinter import *

def volanafunkce():
    print u"zde je tělo volané funkce"

hlavni=Tk()
lista=Frame(hlavni)
lista.pack(fill=BOTH)

img1=PhotoImage(file="new.gif")
img2=PhotoImage(file="open.gif")

b1=Button(lista,image=img1, command=volanafunkce)
b1.pack(side=LEFT, fill= BOTH)
b2=Button(lista, image=img2, command=volanafunkce)
b2.pack(side=LEFT, fill=BOTH)

mainloop()

Tlačítka jsou pakována ke své levé straně a samotná lišta pak ke své straně horní. Parametr fill je u tlačítek BOTH, aby zcela vyplňoval svého rodiče, pokud to bude nutné.

Stavový řádek

Většina aplikací má dole stavový řádek. Implementace tohoto je v Tkinter triviální. Jednoduše použijte udělátko Label a konfigurujte parametr text.

Jednoduchý příklad:

# -*- coding: UTF-8 -*-
from Tkinter import *


hlavni=Tk()

prac=Text(hlavni, height=10)
prac.pack(fill=BOTH, expand=1)

status = Label(hlavni, text="", bd=1, relief=SUNKEN, anchor=W)
status.pack(fill=X)
status["text"] = u"Hej, já jsem stavový řádek!"

mainloop()

Příklad s vlastní třídou

Chcete-li jít s dobou, použijte následující třídu. Vhodně obaluje udělátko Label - poskytuje metody set a clear na nastavování obsahu stavového řádku.

class StatusBar(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.label = Label(self, bd=1, relief=SUNKEN, anchor=W)
        self.label.pack(fill=X)

    def set(self, format, *args):
        self.label.config(text=format % args)
        self.label.update_idletasks()

    def clear(self):
        self.label.config(text="")
        self.label.update_idletasks()

Metoda set je připravena na použití s formátovacími řetězci. To je výhodné, když potřebujete do stavového řádku zapisovat několik proměnných. Například název a čas zapíšete takto (pokud je máte uloženy v proměnných nazev a cas).

status = StatusBar(hlavni)
status.pack(side=BOTTOM, fill=X)
status.set("%s - %s" % (nazev, cas))

Skutečný trik je však použití dědičnosti z udělátka Frame. Vytvořili jsme tak v podstatě nový typ udělátka, se kterým se dá pracovat, jako s jakýmkoliv jiným.

Mohli jsme dědit rovnou z Label a rozšířit ho pouze o metody set a clear, ale toto řešení má několik nevýhod:


Přeložil a upravil - Pavel Kosina - Copyright © 2006 TkinterCZ - GNU Free Documentation License 1.2