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

Listbox - Rozbalený seznam

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.

Kdy Listbox použít

Rozbalené seznamy se používají na výběr jedné nebo více hodnot ze skupiny textových položek.

Pojetí

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.

Identifikátory pozice:

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.

čísla
čísla od 0 do size()-1
END
Konec seznamu. Odpovídá size()-1
ACTIVE
Ukazuje na naposledy kliknutou položku
ANCHOR
Ukazuje na vybranou položku případně na položku označenou pomocí selection_anchor
"@x,y"
kde x a y jsou pixelové souřadnice, vztažené relativně k listboxu

Ukázkový příklad

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



Mazání

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

Režim výběru

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)

Co uživatel vybral?

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.

Command

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:

Jednoduchý klik

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)

Dvojitý klik

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)

Tk vazby Listboxu

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,

Časovač

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

Trable s více listboxy

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)

Posuvníky

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)

Ovládání kolečkem myši a kurzorovými šipkami

Chcete-li ovládat listbox kolečkem myši a/nebo kurzorovými šipkami, případně i PgUp/PgDown, musíte zajistit, aby listbox získal klávesnicový focus. Nejlépe asi toho docílíte svázáním události <Enter> s listboxem:
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.

Referenční příručka

Listbox(master=None, **options) (class) [#]

Posunovací rozbalený seznam.

master
Rodič udělátka.
**options
Parametry udělátka. Viz metoda config ohledně dostupných parametrů.
activate(index) [#]

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.

index
Identifikátor pozice.
bbox(self, index) [#]

Vrací ohraničující box daného položky.

index
Identifikátor pozice.
Vrací:
Ohraničující box jako čtveřici (xoffset, yoffset, šířku, výšku). Pokud je položka neviditelná, vrací None. Pokud je položka viditelná částečně, box může zasahovat mimo viditelnou oblast.
config(**options) [#]

Nastavuje jeden nebo více parametrů. Pokud nejsou zadány žádné, metoda vrací slovník s aktuálními hodnotami všem parametrů.

**options
Parametry udělátka.
activestyle=
Standard je podtrženo. (jméno v databázi option je activeStyle, třída je ActiveStyle)
background=
Standard je 'SystemButtonFace'. (background/Background)
bg=
Stejné jako background.
borderwidth=
Standard je 2. (borderWidth/BorderWidth)
bd=
Stejné jako borderwidth.
cursor=
Žádná standardní hodnota. (cursor/Cursor)
disabledforeground=
Standardní nastavení závisí na systému. (disabledForeground/DisabledForeground)
exportselection=
Standardní hodnota je 1. (exportSelection/ExportSelection)
font=
Standardní nastavení závisí na systému. (font/Font)
foreground=
Standardní nastavení závisí na systému. (foreground/Foreground)
fg=
Stejné jako foreground.
height=
Standardní hodnota je 10. (height/Height)
highlightbackground=
Standardní nastavení závisí na systému. (highlightBackground/HighlightBackground)
highlightcolor=
Standardní nastavení závisí na systému. (highlightColor/HighlightColor)
highlightthickness=
Standardní hodnota je 1. (highlightThickness/HighlightThickness)
listvariable=
Žádné standardní nastavení. (listVariable/Variable)
relief=
Standardní je SUNKEN. (relief/Relief)
selectbackground=
Standardní nastavení závisí na systému. (selectBackground/Foreground)
selectborderwidth=
Standardní je 1. (selectBorderWidth/BorderWidth)
selectforeground=
Standardní nastavení závisí na systému. (selectForeground/Background)
selectmode=
Standardní je BROWSE. (selectMode/SelectMode)
setgrid=
Standardní je 0. (setGrid/SetGrid)
state=
Standardní je NORMAL. (state/State)
takefocus=
Žádné standardní nastavení. (takeFocus/TakeFocus)
width=
Standardní je 20. (width/Width)
xscrollcommand=
Žádné standardní nastavení. (xScrollCommand/ScrollCommand)
yscrollcommand=
Žádné standardní nastavení. (yScrollCommand/ScrollCommand)
curselection() [#]

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.

Vrací:
Seznam identifikátorů pozice.
delete(first, last=None) [#]

Maže jeden nebo více položek. delete(0, END) maže vše.

first
První položka, která se má smazat.
last
Poslední položka, která se má smazat. Je-li vynecháno, maže se jediná položka.
get(first, last=None) [#]

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.

first
První položka, která se má vrátit.
last
Poslední položka, která se má vrátit. Pokud je vynecháno, vrací se jediná položka.
Vrací:
Seznam řetězců.
index(index) [#]

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.

index
Identifikátor pozice.
Vrací:
Číselnou pozici.
insert(index, *elements) [#]

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.

index
Identifikátor pozice.
*elements
Jeden nebo více elementů, které se mají vložit.
itemcget(index, option) [#]

Vrací parametry nastavení jednotlivé položky seznamu.

index
Pozice položky
option
Viz itemconfig
itemconfig(index, **options) [#]

Mění nastavení jednotlivé položky seznamu.

index
Pozice položky.
**options
Parametry jednotlivých položek
background=
Barva pozadí. (background/Background)
foreground=
Barva písma. (foreground/Foreground)
selectbackground=
Barva pozadí při výběru. (selectBackground/Foreground)
selectforeground=
Barva písma při výběru. (selectForeground/Background)
nearest(y) [#]

Vrací nejbližší pozici k dané souřadnici (pixelová souřadnice, relativně vztažená k udělátku samému).

y
Souřadnice.
Vrací:
Pozice.
scan_dragto(x, y) [#]

Posunuje obsah udělátka podle souřadnic myši. Text je posunut o desetinásobek vzdálenosti mezi zarážkou a novou pozicí.

x
Souřadnice myši.
y
Souřadnice myši.
scan_mark(x, y) [#]

Nastavuje zarážku pro rychlý vodorovný posun na dané souřadnice myši.

x
Souřadnice myši.
y
Souřadnice myši.
see(index) [#]

Zajistí, že daná pozice bude viditelná. Můžete použít číselný index nebo END.

index
Identifikátor pozice.
select_anchor(index) [#]

Stejné jako selection_anchor.

select_clear(first, last=None) [#]

Stejné jako selection_clear.

select_includes(index) [#]

Stejné jako selection_includes.

select_set(first, last=None) [#]

Stejné jako selection_set.

selection_anchor(index) [#]

Nastavuje zarážku na danou pozici. Na zarážku se pak může odkazovat pomocí indexu ANCHOR.

index
Identifikátor pozice.
selection_clear(first, last=None) [#]

Vyjímá jednu nebo více položek z výběru.

first
První položka, která se má vyjmout..
last
Poslední položka, která se má vyjmout. Pokud je vynecháno, vyjímá se jen jedna položka.
selection_includes(index) [#]

Kontroluje, jestli je položka vybrána.

index
Identifikátor pozice.
Vrací:
Pravdu, pokud je položka vybrána.
selection_set(first, last=None) [#]

Přidává jednu nebo více položek k výběru.

first
První položka.
last
Poslední položka. Pokud je vynecháno, přidává se jen jedna položka.
size() [#]

Vrací počet položek v seznamu. Platný rozsah pozic/indexů je od 0 do size()-1.

Vrací:
Počet položek v seznamu.
xview(column, *extra) [#]

Ří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.

column
Sloupec, který se má objevit na levé hraně, nebo řetězec, který určuje, který podpříkaz vykonat.
*extra
Dodatečné argumenty k formám "moveto" a "scroll". Detaily výše.
Vrací:
Pokud je zavolána bez argumentů, vrací dvojici, obsahující levý offset a velikost pohledu, relativně k celé šířce.
xview_moveto(fraction) [#]

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.

fraction
Offset.
xview_scroll(number, what) [#]

Posouvá vodorovný pohled na seznam o dané číslo.

number
Počet jednotek.
what
Jaké jednotky použít. Může být buď "units" (znaky) nebo "pages" (delší kroky).
yview(*what) [#]

Řídí svislý posun. Tato metoda funguje podobně jako xview, ale svisle.

Chcete-li docílit viditelnosti určité položky, použijte metodu see.

index
Pozice, která se má umístit k horní hraně nebo řetězec, určující jaký podpříkaz se má vykonat.
*extra
Dodatečné argumenty k formám "moveto" a "scroll".
Vrací:
Pokud je zavolána bez argumentů, vrací dvojici, obsahující levý offset a velikost pohledu, relativně k celé výšce.
yview_moveto(fraction) [#]

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.

fraction
Offset.
yview_scroll(number, what) [#]

Posouvá svislý pohled na seznam o dané číslo..

number
Počet jednotek.
what
Jaké jednotky použít. Může být buď "units" (znaky) nebo "pages" (delší kroky).

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