Úvod do Tkinter - Okna pro jazyk Python - Postavené na základech 'An Introduction to Tkinter'
Listbox je standardní udělátko, které se používá na zobrazení seznamu nějakých hodnot. Listbox může obsahovat jen textové položky a všechny položky musí mít stejnou barvu i font. Uživatel si může zvolit se seznamu, v závislosti na parametrech, jednu nebo více položek.
Rozbalené seznamy se používají na výběr jedné nebo více hodnot ze skupiny textových položek.
Když Rozbalený seznam vytvoříte, je prázdný. První věc je tedy ho naplnit jednou nebo více řádkami textu. Metoda insert vkládá text na danou pozici v seznamu.
Pozice je obvykle číslo položky (0 značí první položku), ale můžete také použít některý ze speciálních pozičních indexů, jako třeba ACTIVE, který ukazuje na "vybranou" položku, nebo END, který ukazuje na konec seznamu.
# -*- coding: utf-8 -*- from Tkinter import * hlavni = Tk() hlavni.option_add('*Font', 'serif 8') # protože defaultní písmo pod Windows je hrozné listbox = Listbox(hlavni) listbox.pack() listbox.insert(END, u"položka seznamu") for item in [u"jedna", u"dva", u"tři", u"čtyři"]: listbox.insert(END, item) mainloop()
Chcete-li smazat položku ze seznamu, použijte metodu delete. Nejobvyklejší operace je smazání všech položek v seznamu:
listbox.delete(0, END)
Můžete také mazat jednotlivé položky. V následujícím příkladu se vytváří specielní tlačítko, které maže aktivní položku se seznamu.
b = Button(hlavni, text="Smazat!",command=lambda : listbox.delete(ANCHOR)) b.pack()
Rozbalený seznam nabízí čtyři různé režimy výběrů přes parametr selectmode. Jsou to SINGLE (možno vybrat jen jednu položku), BROWSE (stejné, ale výběr se dá posouvat pomocí myši), MULTIPLE (možnost vybrat více voleb) a EXTENDED (možnost vybrat několik skupin položek pomocí kláves Shift a CTRL). Standard je BROWSE. Použijte MULTIPLE, pokud chcete podobné chování, jako u zaškrtávátek a EXTENDED, kdy uživatel nejčastěji vybírá jednu položku, ale někdy potřebuje vybrat celou skupinu položek.
listbox = Listbox(selectmode=EXTENDED)
Chcete-li zjistit, co uživatel vybral, použijte metodu curselection. Vrací seznam pozic položek jako řetězce. Chcete-li je převést jednoduše na čísla, můžete použít funkci map:
items = map(int, list.curselection())
Použijte metodu get, chcete-li zjistit, co se nachází na určité pozici. Jako parametr tato metoda přijímá číslo pozice a to jak ve tvaru řetězce tak celého čísla.
Listbox bohužel nemá parametr command, která by vám umožňovala sledovat změny ve výběrech. Řešení mohou být také tato:
Protože obyčejné curselection() s metodou listbox.bind("<1>", funkce) funguje podivně (vždy vrací předchozí výběr), je možný následující trik:
# -*- coding: utf-8 -*- from Tkinter import * def klik(param): print listbox.curselection()[0] hlavni = Tk() hlavni.option_add('*Font', 'serif 8') listbox = Listbox(hlavni) listbox.bind( "<1>", None) listbox.bind( "<ButtonRelease-1>", klik) # metoda se volá až po uvolnění myši listbox.pack() listbox.insert(END, u"jedna", u"dva", u"tři", u"čtyři") mainloop()
Podobný trik se dá udělat pomocí souřadnic x a y od předaného parametru:
def klik(param): souradnice="@"+str(param.x)+","+str(param.y) print listbox.get(souradnice)
Standardní řešení je svázat dvojitý klik ke stejné volané funkci jako tlačítko OK. Toto umožní uživateli vybrat položku jedním klikem a pak kliknout na OK a pokračovat nebo rovnou dvojklik na žádané položce. Toto řešení funguje nejlépe v režimech BROWSE a EXTENDED.
listbox.bind("<Double-Button-1>", ok)
Chcete-li sledovat jakékoliv změny ve výběru okamžitě, jako kdyby existoval command, můžete buď svázat všechny možnosti výběrů příslušných událostí (viz Tk stránky, kde najdete kompletní seznam vazeb Listboxu) nebo o mnoho jednodušeji,
pomocí časovače sledovat výběr:
.... class Box: "Třída jako kontejner atributů" pass def sledovatListbox(): nyni=listbox.curselection() if nyni != box.minulyVyber: print u"Výber je:", nyni box.minulyVyber=nyni hlavni.after(250, sledovatListbox) ..... box=Box() box.minulyVyber=None sledovatListbox() mainloop()
Standardně je výběr exportován pod Linuxem pomocí X selection mechanismus a pod Windows pomocí schránky. Pokud máte více jak jeden listbox v okně, situace se pro běžného uživatele, chudáka, komplikuje. Když vybere něco v jednom listboxu a pak hned něco jiného v druhém listboxu, původní výběr se ztrácí. Vyzkoušejte toto chování:
# -*- coding: utf-8 -*- from Tkinter import * hlavni = Tk() hlavni.option_add('*Font', 'serif 8') # protože defaultní písmo pod Windows je hrozné listbox = Listbox(hlavni, selectmode=MULTIPLE) listbox.pack() listbox2 = Listbox(hlavni, selectmode=MULTIPLE) listbox2.pack() for item in [u"jedna", u"dva", u"tři", u"čtyři"]: listbox.insert(END, item) listbox2.insert(END, item) mainloop()
Je vhodné tento mechanismus v těchto případech vypínat:
listbox = Listbox(hlavni, selectmode=MULTIPLE,exportselection=0) listbox2 = Listbox(hlavni, selectmode=MULTIPLE,exportselection=0)
Samotný listbox neobsahuje posuvníky. Nicméně připojení posuvníků je vcelku přímočaré. Jednoduše nastavte parametry xscrollcommand a yscrollcommand listboxu na metodu set odpovídajícího posuvníku a parametr posuvníku command na odpovídající metody listboxu xview a yview. Nezapomeňte také zapakovat posuvníky před listboxem. V následujícím příkladu je použit jen posuvník svislý. Více příkladů najde v popisu Scrollbar.
# -*- coding: utf-8 -*- from Tkinter import * hlavni = Tk() hlavni.option_add('*Font', 'serif 8') # protože defaultní písmo pod Windows je hrozné frame = Frame(hlavni) frame.pack() scrollbar = Scrollbar(frame, orient=VERTICAL) listbox = Listbox(frame, yscrollcommand=scrollbar.set) scrollbar.config(command=listbox.yview) scrollbar.pack(side=RIGHT, fill=Y) listbox.pack(side=LEFT, fill=BOTH, expand=1) for item in u"Žluťoučký kůň pěl ďábelské ódy!".split()*10: listbox.insert(END, item) hlavni.mainloop()
Fintou můžete dosáhnout stavu, kdy s jedním posuvníkem budete pohybovat několika listboxy. To předpokládá, že všechny listboxy mají stejný počet položek. Všimněte si také pořadí pakování udělátek:
def __init__(self, hlavni): scrollbar = Scrollbar(hlavni, orient=VERTICAL) self.b1 = Listbox(hlavni, yscrollcommand=scrollbar.set) self.b2 = Listbox(hlavni, yscrollcommand=scrollbar.set) scrollbar.config(command=self.yview) scrollbar.pack(side=RIGHT, fill=Y) self.b1.pack(side=LEFT, fill=BOTH, expand=1) self.b2.pack(side=LEFT, fill=BOTH, expand=1) def yview(self, *args): apply(self.b1.yview, args) apply(self.b2.yview, args)
def focusWidget(udalost): udalost.widget.focus_set() listbox.bind("<Enter>", focusWidget)Je dobré použít ještě vazbu <Leave>, aby jste neměli aktivní kolečko myši, když už budete myší jezdit úplně někde jinde.
Posunovací rozbalený seznam.
Aktivuje daný index - bude zvýrazněn podtržením. Na aktivní prvek se dá odkazovat pomocí indexu ACTIVE. Pozn. předkladatele - nějak mi to nefunguje.
Vrací ohraničující box daného položky.
Nastavuje jeden nebo více parametrů. Pokud nejsou zadány žádné, metoda vrací slovník s aktuálními hodnotami všem parametrů.
Vrací list aktuální stavu výběru položek. Seznam obsahuje pozice vybraných položek (začíná se od 0). Na většině instalací Pythonu se jedná o seznam řetězců (někde čísel). Protože se toto chování může v budoucnu změnit, měli byste zajistit, aby váš kód dokázal zpracovat oba dva případy. Viz kapitolu Pojetí, kde je malá nápověda, jak na to.
Maže jeden nebo více položek. delete(0, END) maže vše.
Vrací jednu nebo více položek ze seznamu. Tato metoda vrací řetězec odpovídající pozici (nebo řetězce v zadaném rozsahu pozic). Použijte get(0, END) a dostanete seznam všech hodnot. Použijte get(ACTIVE) a dostanete aktivní, podtrženou položku.
Vrací číselný index (od 0 do size()-1), který odpovídá danému indexu. Typicky je to ACTIVE, ale může být i ANCHOR nebo řetězec ve tvaru"@x,y" - viz výše Identifikátory pozice.
Vkládá jeden nebo více položek na danou pozici. Toto funguje stejně jako u pythonovských seznamů - pozice 0 je první. Použijte END , chcete-li položku připojit na konec. Použijte ACTIVE, chcete-li vložit položku před aktivní položku.
Vrací parametry nastavení jednotlivé položky seznamu.
Mění nastavení jednotlivé položky seznamu.
Vrací nejbližší pozici k dané souřadnici (pixelová souřadnice, relativně vztažená k udělátku samému).
Posunuje obsah udělátka podle souřadnic myši. Text je posunut o desetinásobek vzdálenosti mezi zarážkou a novou pozicí.
Nastavuje zarážku pro rychlý vodorovný posun na dané souřadnice myši.
Zajistí, že daná pozice bude viditelná. Můžete použít číselný index nebo END.
Stejné jako selection_anchor.
Stejné jako selection_clear.
Stejné jako selection_includes.
Stejné jako selection_set.
Nastavuje zarážku na danou pozici. Na zarážku se pak může odkazovat pomocí indexu ANCHOR.
Vyjímá jednu nebo více položek z výběru.
Kontroluje, jestli je položka vybrána.
Přidává jednu nebo více položek k výběru.
Vrací počet položek v seznamu. Platný rozsah pozic/indexů je od 0 do size()-1.
Řídí vodorovný posun.
Pokud je metoda zavolána bez argumentu, vrací rozsah seznamu, který je viditelný ve vodorovném směru. Hodnota je vrácena jako offset a velikost viditelné části vzhledem k celému seznamu. (1.0 je celý seznam).
Pokud je zavolána s jediným argumenten, nastavuje seznam v okně tak, aby daný sloupec písmen byl na levé hraně listboxu.
Pokud je zavolána s řetězci "moveto" a zlomek, chová se tato metoda jako xview_moveto. Pokud je zavolána s řetězcem "scroll" a ještě dvěma argumenty, chová se tato metoda jako xview_scroll.
Nastavuje seznam, takže daný offset je u horní hrany listboxu. Offset 0.0 je začátek seznamu, 1.0 je konec. Tyto metody používá vazba od Scrollbar, když uživatel hýbe s jezdcem posuvníku.
Posouvá vodorovný pohled na seznam o dané číslo.
Řídí svislý posun. Tato metoda funguje podobně jako xview, ale svisle.
Chcete-li docílit viditelnosti určité položky, použijte metodu see.
Nastavuje seznam, takže daný offset je u horní hrany listboxu. Offset 0.0 je začátek seznamu, 1.0 je konec. Tyto metody používá vazba od Scrollbar, když uživatel hýbe s jezdcem posuvníku.
Posouvá svislý pohled na seznam o dané číslo..
Přeložil a upravil - Pavel Kosina - Copyright © 2007 TkinterCZ - GNU Free Documentation License 1.2