Úvod do Tkinter - Okna pro jazyk Python - Postavené na základech 'An Introduction to Tkinter'
Udělátko Text zobrazuje text. Nabízí vám zobrazení a editaci textu v mnoha variantách. Podporuje také vkládání obrázků a oken.
Udělátko Text použijte, chcete-li zobrazit textové dokumenty, které obsahují čistý nebo formátovaný text (použití nejrůznějších fontů, vložené obrázky a další). Udělátko text může být také použito jako textový editor.
Vytvoříte-li nový text, je prázdný. Na vložení textu do udělátku používejte metodu insert. Vkládejte text na pozice INSERT nebo END:
from Tkinter import * root=Tk() text=Text() text.pack() text.insert(END, "ahoj, ") text.insert(END, "svete") mainloop()
K nově přidávanému textu můžete přidávat tzv. tagy (styly), které určují vlastnosti textu:
from Tkinter import * root=Tk() text=Text() text.pack() text.tag_config("modre", foreground="blue", underline=1) text.insert(END, "kliknete zde!", "modre") text.insert(END, "\n") text.insert(END, "anebo zde!", "cervene") text.tag_config("cervene", foreground="red", underline=1, font="Arial 20 bold") mainloop()
Chcete-li vkládat vložené objekty, použijte metody window_create nebo image_create:
def click(): print "klik" button = Button(text, text="Klik", command=click) text.window_create(INSERT, window=button)
Chcete-li něco smazat, používejte metodu delete. Takto smažete komplet celý text (maže také všechny vložené obrázky a objekty, ale ne značky):
text.delete(1.0, END)
Chcete-li smazat jeden znak, případně jeden vložený objekt nebo obrázek, použijte metodu delete s jediným argumentem:
text.delete(INSERT) text.delete(button)
Chcete-li změnit udělátko na jen pro čtení, změňte vlastnost state z NORMAL na DISABLED:
text.config(state=NORMAL) text.delete(1.0, END) text.insert(END, text) text.config(state=DISABLED)
Budete-li chtít nyní v programu vkládat do udělátka další text, budete muset zpětně nastavit vlastnost na NORMAL. Jinak jsou všechna volání insert a delete tiše ignorována.
K načtení textu do proměnné použijte metodu get:
obsah = text.get(1.0, END)
Metoda index převádí jakoukoliv pozici jakéhokoli tvaru na formát radka/sloupec. Použijte to, pokud chcete uložit "absolutní" pozici.
index = text.index(index)
Chcete-li však mít stálý přehled o pozicích určitého slova (slov) - i když dojde k vložení nebo smazání nějakého jiného textu - měli byste používat značky - marks.
text.mark_set("prvniZnacka", index) text.mark_unset("prvniZnacka")
Malý návod, jak sledovat, jestli v textu nenastala nějaká změna:
import tkinter,md5 def sifrace(obsah): return md5.md5(obsah).digest() sifraOld = sifrace(text.get(1.0, END)) # vlozeni textu # neco ... sifraNew = sifrace(text.get(1.0, END)) if sifraOld != sifraNew: print "Obsah se zmenil!" sifraOld=sifraNew
oblasti = text.tag_ranges(tag) for i in range(0, len(oblasti), 2): start = oblasti[i] stop = oblasti[i+1] print tag, repr(text.get(start, stop))
Metoda search umožňuje vyhledávat v textu. Nabízí se hledání podle přesné shody (default) nebo regulární výrazy ala Tcl (voláno s regexp = True).
text.insert(END, "ahoj, svete") start = 1.0 while 1: pozice = text.search("o", start, stopindex=END) if not pozice: break print pozice start = pozice + "+1c"
Vynecháte-li volbu stopindex, vyhledání se bude stále opakovat.
Udělátko Text ukládá a zobrazuje řádky textu.
Tělo textu může obsahovat znaky, značky, vložené okna a obrázky. Různé oblasti se mohou zobrazovat jinak, k oblastem textu se také dají přiřadit události.
Normálně můžete text editovat pomocí klávesnice a myši. Nastavte volbu state na DISABLED a docílíte opak (nejde pak vkládat ani pomocí metody insert).
Pozice se používají pro označení míst v textu. Podobně jako pythonovské pozice v seznamech, pozice Textu odpovídají místům mezi dvěma znaky.
Tkinter nabízí následující typy pozic:
END
INSERT
CURRENT
uživatelsky definované značky
uživatelsky definované tagy ("tag.first", "tag.last")
výběry (SEL_FIRST, SEL_LAST)
řádka/sloupec ("radka.sloupec")
konec řádky ("radek.end")
souřadnice okna ("@x,y")
jména vložených objektů (okna, obrázky)
výrazy
INSERT (nebo "insert") odpovídá aktuální pozici vkládacího kurzoru.
CURRENT (nebo "current") odpovídá znaku nejblíže k myši. Aktualizuje se však pouze při pohybu samotné myši bet tisknutí pravého či levého tlačítka (aktualizace nastane, jakmile tlačítko myši pustíte).
END (nebo "end") odpovídá pozici hned za posledním znakem.
Uživatelsky definovaní značky jsou pojmenované pozice v textu. INSERT a CURRENT jsou předdefinované značky, ale můžete vytvářet také své. Více níže.
Uživatelsky definované tagy reprezentují specielní styly a události, které se mohou k vybranému textu přiřadit. Více níže.
Na začátek oblasti označené tagem se můžete odkazovat pomocí syntaxe "tag.first" (hned před první znak oblasti označené tagem) a "tag.last" (hned za poslední znak oblasti označené tagem).
Výběr je specielní tag jménem SEL (nebo "sel"), který odpovídá aktuálnímu výběru. Při odkazech na výběr použijte konstanty SEL_FIRST a SEL_LAST
řádka/sloupec jsou základní poziční typ. Zadávají se jako řetězec, který se skládá z čísla řádky a čísla sloupce spojeného tečkou. Čísla řádku začínají na 1, zatímco čísla sloupců začínají na 0. Tyto pozice můžete vytvářet například takto:
"%d.%d" % (radka, sloupec)
Není chyba zadat čísla řádek nebo sloupců za současným rozmezím. Taková čísla pak odpovídají řádce za poslední řádkou, respektive za posledním znakem řádku.
Všimněte si, že pozice řádka/sloupec vypadají jako desetinná čísla, ale zřídka se dají také zaměnit (zvažte 1.25 vs. 1.3). Výjimku tvoří v tomto smyslu 1.0, které se použít jako zkráceného "1.0".
Metoda index převádí všechny typy indexů do typu řádka/sloupec.
Konec řádku je pozice, která se zadává ve tvaru "cisloRadku.end" a odpovídá znaku nového řádku na konci každé řádky.
Můžete také používat pozice typu okenní souřadnice. Při událostech můžete například nalézt nejbližší znak u myši pomocí:
"@%d,%d" % (udalost.x, udalost.y)
Vložená jména objektů se mohou použít k odkazům na okna a obrázky vložené do textu. Chcete-li se odkazovat na okno, použijte jako pozici odpovídající instanci. Chcete-li se odkazovat na obrázek, použijte odpovídající Tkinter instanci PhotoImage nebo BitmapImage.
Výrazy se používají pro modifikace jakéhokoliv typu pozice. Výrazy se skládají z vlastní pozice a jednoho nebo více modifikátorů z následujícího přehledu:
"+ počet chars" posouvá pozici kupředu. Pozice se posouvá přes nové řádky, avšak nikdy za pozici END.
"- počet chars" posouvá pozici dozadu. Pozice se posouvá přes nové řádky, avšak nikdy před "1.0".
"+ počet lines" a "- počet lines" posouvá pozici pod celých řádcích dopředu nebo dozadu. Je-li to možná, pozice sloupce se zachovává, je-li řádek příliš krátká, je pozice na konci toho řádku.
"linestart" a "lineend" posune pozici před první anebo za poslední znak řádku - to je nová řádka.
"wordstart" a "wordend" posune pozici na začátek nebo konec slova. Slova jsou posloupnosti znaků, číslic a podtržítka anebo jediného nemezerového znaku.
Klíčová slova se mohou zkracovat a mezery vynechávat. Např. "+ 5 chars" se dá zkrátit na "+5c".
"insert -5c" značí 5 znaků před aktuální pozicí "end -1l" značí začátek posledního řádku "insert linestart" značí začátek aktuálního řádkuPříklad smazání znaku před kurzorem
def backspace(udalost): udalost.widget.delete("%s-1c" % INSERT, INSERT)
Značky jsou obvykle neviditelné objekty vložené v textu. Značky jsou umístěny mezi znaky textu a posouvají se s celým textem.
uživatelsky definované značky
INSERT
CURRENT
Značky jsou obyčejné řetězce, které mohou obsahovat cokoliv kromě mezer. Je však doporučeno používat pouze abecedu plus čísla. K vytvoření nebo přesunu značky slouží metoda mark_set.
Tkinter má dvě zvláštní předdefinované značky:
INSERT (nebo "insert") je speciální značka ukazující na místo, kde je vkládací kurzor. Tato značka není úplně neviditelná, protože kurzor je běžně vidět.
CURRENT (nebo "current") je speciální značka ukazují na místo nejblíže k myši. Aktualizuje se však jen když hýbete s myší a nedržíte přitom žádné myšoidní tlačítko.
Tyto speciální značky se dají ovládat stejně jako jiné, ale nedají se smazat.
Smažete-li nebo vložíte-li text před značku, značka se přesune společně s ostatním textem. Ke smazání značky použijte metodu mark_unset. Smazání okolního textu nemaže automaticky samotnou značku.
Vložíte-li na značku text, značka se posune vpravo nebo vlevo v závislosti na nastavené přitažlivosti - gravity - (LEFT nebo RIGHT; default je RIGHT). Na změnu přitažlivosti u jednotlivé značky použijte metodu mark_gravity.
V následujícím příkladu je značka "sentinel" použita, aby uchovala původní pozici vkládacího kurzoru:
text.mark_set("sentinel", INSERT) text.mark_gravity("sentinel", LEFT)
Nyní můžete nechat uživatele vepsat text na místě vkládacího kurzoru a následně použít text.get(sentinel, INSERT), chcete li se dozvědět, co napsal.
Tagy se požívají, pokud chcete používat styly písma (známé například z textových editorů Word, OpenOffice) a/nebo volání událostí na příslušném textu.
uživatelsky definované tagy
SEL
Uživatelských tagů můžete mít libovolně mnoho. Každý text může mít přičleněno několik tagů a stejný tag se může použít na více místech. Narozdíl od udělátka Canvas, tagy v udělátku Text nezmizí, pokud nebude existovat žádný text, který je bude používat.
Jména tagů jsou obyčejné řetězce, které mohou obsahovat cokoliv mimo mezer.
SEL (nebo "sel") je speciální tag, který odpovídá aktuálnímu výběru. Tag výběru by se měl v textu objevovat maximálně jednou.
Následující volby se používají s metodou tag_config k určení "jak bude písmo vypadat", které bude označeno příslušným tagem:
Barva pozadí pro tento tag. Poznámka: bg není background ve spojení s tagem.
Jméno bitmapy, které se použije pro vykreslení pozadí. Obvyklé bitmapy jsou: "gray12", "gray25", "gray50" nebo "gray75". Default je solid brush (žádná bitmapa).
Šířka okraje textu. Standard je 0 (bez okraje). Poznámka: bd není borderwitdth.
Jméno bitmapy, která se použije pro vykreslení textu. Obvyklé bitmapy jsou: "gray12", "gray25", "gray50" nebo "gray75". Default je solid brush (žádná bitmapa).
Font, který se použije pro tento tag. Například 20 tučně arial je: "Arial 20 bold".
Barva tohoto tagu. Poznámka: fg není foreground.
Řídí zarovnávání textu. První znak řádky určuje, jak bude zarovnána celá řádka. LEFT, RIGHT nebo CENTER. Standard je LEFT.
Levý okraj pro první řádku bloku textu s daným tagem. Standard je 0 (bez okraje).
Levý okraj pro všechny řádky kromě první bloku textu s daným tagem. Standard je 0 (bez okraje).
Řídí, jestli bude text pozdvižen nebo ponížen oproti základní lince. Kladná čísla značí Horní index, záporná Dolní. Standard je 0 (bez offsetu).
Text je přeškrtnut, je-li flag nenulový. Je lepší však používat přeškrtávání na úrovni fontu.
Ohraničení textu. Použijte SUNKEN, RAISED, GROOVE, RIDGE nebo FLAT. Standard je FLAT (bez ohraničení).
Pravý okraj. Standard je 0 (bez pravého okraje).
Mezera nad prvním řádkem. Standard je 0 (žádné odsazení).
Mezera mezi řádky bloku textu s daným tagem. Standard je 0.
Mezera pod poslední řádkou bloku textu. Standard je 0.
Text bude podtržen, pokud hodnota flagu bude nenulová. Například klasický odkaz docílíte pomocí (foreground="blue", underline=1). Nejlepší výsledky však dosáhnete spíše pomocí volby font.
Zarovnávání textu. NONE, CHAR nebo WORD.
Připojíte-li k textu několik tagů, platí pravidla, že poslední přepíše předchozí. V následujícím příkladu bude modrý text na žlutém pozadí:
text.tag_config("n", background="yellow", foreground="red", font="Arial 20") text.tag_config("a", foreground="blue") text.insert(END, "ahoj", ("n", "a"))
Nezáleží na pořadí tagů v tag_insert, ale na pořadí, v jakém se uvádějí tag_config. Změnit priority tagů můžete však pomocí tag_raise a tag_lower. Text bude červený, přidáte-li text.tag_lower("a") k příkladu uvedenému výše.
Metoda tag_bind vám umožňuje svázat událost s textem majícím patřičný tag. Tagy mohou přijímat události od myši i klávesnice včetně událostí Enter a Leave. Následující příklad vytváří klasický hypertextový odkaz se vším všudy:
from Tkinter import * def click(udalost): print "Klik!" def show_hand_cursor(event): event.widget.configure(cursor="hand1") def show_arrow_cursor(event): event.widget.configure(cursor="") root=Tk() text=Text() text.pack() text.tag_config("a", foreground="blue", underline=1) text.tag_bind("a", "<Enter>", show_hand_cursor) text.tag_bind("a", "<Leave>", show_arrow_cursor) text.tag_bind("a", "<Button-1>", click) text.config(cursor="arrow") text.insert(INSERT, "Klikni na me!", "a") mainloop()
Udělátko pro zobrazování a editaci textu.
Počítá ohraničující box daného znaku.
Tato metoda je funkční pouze, když je udělátko aktualizováno. Buďte si jistí a použijte metodu update_idletasks.
Porovnává dvě pozice. Parametr op může být "<", "<=", "==", ">=", ">" nebo "!=" (Pythonovské "<>" není podporováno).
Upravuje jeden nebo více parametrů udělátka. Vrací aktuální nastavení ve formě slovníku, pokud je volána bez parametrů.
Zapíná nebo vypíná ladění.
Maže znak (nebo vložený objekt) na dané pozici nebo celý text v daném rozsahu.
Počítá ohraničující box řádky pro daný znak.
Tato metoda je funkční pouze, když je udělátko aktualizováno. Buďte si jistí a použijte metodu update_idletasks.Výpis obsahu udělátka.
Metoda edit_modified.
Metoda edit_redo.
Metoda edit_reset.
Metoda edit_separator.
Metoda edit_undo.
Vrací znak na dané pozici nebo celý text v daném rozsahu.
Vrací aktuální hodnotu daného parametru. Pokud na dané pozici žádný obrázek není, je vyvolána výjimka TclError.
Mění jeden nebo více parametrů. Není-li na pozici žádný obrázek, je vyvolána výjimka TclError.
Vkládá obrázek na danou pozici. Obrázek musí být PhotoImage nebo BitmapImage instance (nebo instance odpovídající třídy PIL).
Tato metoda nefunguje v Tk níže něž 8.0. Obejít se dá vložením obrázku do udělátka Label a použitím window_create.
Hledá jména všech obrázků v textovém udělátku. Tkinter neumožňuje vracet odpovídající objekty PhotoImage a BitmapImage, nicméně můžete si je uchovávat ve slovníku, při použití str(image) jako klíče.
Vrací pozici ve tvaru "řádka.sloupec" z jakéhokoliv typu dané pozice.
Vkládá text na danou pozici. Pozice je typicky INSERT nebo END. Předáte-li jeden nebo více tagů, budou přilípnuty k novému textu.
Vložíte-li text na značku, bude značka posunuta podle nastavení gravity.
Nastavuje přitažlivost (gravity) pro danou značku. Přitažlivost řídí, jak posunout značku, když je text vložen právě na značku. Značka zůstane na místě, pokud je gravity LEFT (text se vloží za značku). Značka se posune vpravo na konec vkládaného textu, pokud je gravity RIGHT (text se vloží před značku). Standard je RIGHT.
Najde všechny značky v udělátku. Zahrnuje i INSERT a CURRENT, ale ne END, který je speciální pozice, ne značka.
Metoda mark_next.
Metoda mark_previous.
Posune značku na danou pozici. Pokud značka neexistuje, je vytvořena s přitažlivostí RIGHT. Používejte tuto metodu i pro změnu aktuální pozice značek INSERT a CURRENT.
Odstraní značku. Značky INSERT a CURRENT se odstranit nedají.
Roluje obsah udělátka. Text je posunut 10x více, než je vzdálenost mezi zarážkou a novou pozicí.
Nastavuje zarážku. Je používána pro rychlé rolování.
Hledá řetězce nebo regulární výrazy.
Zajistí, aby daná pozice byla viditelná. Pokud není, bude rolováno, aby byla vidět.
Metoda tag_add.
Metoda tag_bind.
Metoda tag_cget.
Metoda tag_config.
Metoda tag_configure.
Metoda tag_delete.
Metoda tag_lower.
Metoda tag_names.
Metoda tag_nextrange.
Metoda tag_prevrange.
Metoda tag_raise.
Metoda tag_ranges.
Metoda tag_remove.
Metoda tag_unbind.
Vrací současnou hodnotu daného okenního parametru. Pokud nic takového neexistuje, vrací výjimku TclError.
Mění jednu nebo více okenního parametrů. Pokud nic takového neexistuje, vrací výjimku TclError.
Stejné jako window_config.
Vkládá udělátko na danou pozici. Můžete buď nejprve vytvořit udělátko, které by mělo být potomkem samotného textového udělátka, a vložit ho pomocí window nebo poskytnout zpětné volání create, které bude zavoláno, když bude okno poprvé zobrazeno.
Vrací n-tici, obsahující všechna vložená okna.
Ukázkový příklad, jak převést jména na seznam instancí udělátek:
windows = text.window_names() try: windows = map(text.nametowidget, windows) except TclError: pass
Metoda xview.
Metoda xview_moveto.
Metoda xview_scroll.
Metoda yview.
Metoda yview_moveto.
Metoda yview_pickplace.
Metoda yview_scroll.
Přeložil a upravil - geon - Copyright © 2007 TkinterCZ - GNU Free Documentation License 1.2