Úvod do Tkinter - Okna pro jazyk Python - Postavené na základech 'An Introduction to Tkinter'
Hlavní okno
Menu
Nástrojová lišta
Stavový řádek
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.
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:
# -*- 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.
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.
# -*- 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é.
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.
# -*- 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()
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:
Bude obtížnější udržet integritu stavového řádku. Někdo může švindlovat a místo set používat config. Nebyl by to snad velký problém, pokud byste se jednoho dne nerozhodli, že do metody set přidáte ještě něco. A nebo budete chtít místo Label implementovat Canvas.
Zvyšuje to riziko, že vaše dodatečné metody budou v konfliktu s parametry nebo metodami Tkinter. Zatímco Frame a Toplevel mají metod relativně málo, další udělátka mají desítky specifických parametrů a metod.
Budoucí verze Tkinter mohou používat spíše factory functions namísto tříd u většiny udělátek. Nicméně stále je, víceméně, zaručeno, že Frame a Toplevel třídami zůstanou. Jinými slovy: jistota je lepší než omluva.
Přeložil a upravil - Pavel Kosina - Copyright © 2006 TkinterCZ - GNU Free Documentation License 1.2