tkinter.Listbox【リストボックス ウィジェット】
メモ ( 作成 例 要素の追加 例 要素の選択・選択要素の取得 例 スクロールバー関連付け 例 ) 仮想イベント 例 オプション メソッド 例
メモ
- リストボックス ウィジェットの作成〔 例 〕
- tkinter.Listbox:従来のウィジェット
- 要素の追加〔 例 〕
- 初期値:listvariable【ウィジェット変数 (リスト)】に設定
- insert( )【要素挿入】で追加
- 要素の選択・選択要素の取得〔 例 〕
- ※選択要素を保持:exportselection【Xセレクション】 を無効
- 単一選択・複数選択の設定:selectmode【選択操作スタイル】
- 未選択:select_clear( )【要素選択 解除】
- 選択:select_set( )【要素選択】
- 選択要素取得:curselection( )【選択要素 取得】
- スクロールバー関連付け〔 例 〕
- スクロールバーが付いていない為、必要な場合は Scrollbar【スクロールバー】を作成して関連付け
方向 Listboxのオプション 設定値 水平方向 xscrollcommand
【水平方向のスクロール発生時の呼び出し関数】水平 Scrollbar【スクロールバー】の set( )【範囲設定】 垂直方向 yscrollcommand
【垂直方向のスクロール発生時の呼び出し関数】垂直 Scrollbar【スクロールバー】の set( )【範囲設定】 方向 Scrollbarのオプション 設定値 水平方向 水平 Scrollbar【スクロールバー】の
command【スクロールバー操作の呼び出し関数】xview( )【水平方向スクロールコマンド処理】 垂直方向 垂直 Scrollbar【スクロールバー】の
command【スクロールバー操作の呼び出し関数】yview( )【垂直方向スクロールコマンド処理】
外部リンク
仮想イベント
- イベント設定〔 例 〕
- bind( )【イベント関連付け】で設定 〔イベント関連メソッド 〕
仮想イベント | 説明 |
---|---|
<<ListboxSelect>> | 項目選択で発生 引数 eventイベントオブジェクト |
オプション
メモ
- オプションの設定方法
- コンストラクタで辞書型引数 (tk のみ)・キーワード引数として指定
- オプション名を辞書インデックスとして指定 ( widget ['オプション名'] )
- config・configure【オプション設定・取得】で辞書型引数・キーワード引数として指定
- オプション関連のメソッド
- オプション関連メソッド
- Style.configure( ):Style に設定した値
- 注) 実装依存 (各種ドキュメントに相違があり)
オプション 一覧
個別 | tk | ttk | 説明 |
---|---|---|---|
activestyle | ● | アクティブ要素のスタイル ・DOTBOX:点線枠 ・NONE:特殊スタイルなし ・UNDERLINE:下線 | |
exportselection | ● | Xセレクション ・True・YES 等の定数:有効 ・False・NO 等の定数:無効 ※選択要素を保持:無効 | |
selectmode | ● | 選択操作のスタイル ・SINGLE【クリック (単一選択)】:1項目・クリックでのみ選択項目を変更 ・BROWSE【ドラッグ (単一選択)】:1項目・ドラッグで選択項目を変更可 ・MULTIPLE【複数 (複数選択可)】:項目のクリックで選択状態を切換 ・EXTENDED【拡張 (複数選択可)】:[Shift]+クリック・[Ctrl]+クリック 等の操作可 | |
setgrid | ● | ||
state | ● | 状態 ・NORMAL【通常状態】 ・DISABLED【無効状態】 (disabledforeground【無効時の前景色】を使用) | |
xscrollcommand | ● | 水平方向のスクロール発生時の呼び出し関数 (関連スクロールバーの操作等の処理) | |
yscrollcommand | ● | 垂直方向のスクロール発生時の呼び出し関数 (関連スクロールバーの操作等の処理) | |
リスト項目 | tk | ttk | 説明 |
font | ● | フォント (tkinter.Font) | |
listvariable | ● | ウィジェット変数 (リスト) | |
サイズ・配置 | tk | ttk | 説明 |
height | ● | 行数 (0以下:全体表示) | |
width | ● | 幅 (文字単位 / 0以下:全体表示) | |
justify tk 8.6.5 | ● | テキストの配置位置 ・LEFT【左端寄せ】 ・CENTER【中央寄せ】 ・RIGHT【右端寄せ】 | |
外観 | tk | ttk | 説明 |
borderwidth (bd) | ● | 境界線の幅 | |
relief | ● | 全体と選択要素の外観 | |
色 関連 | tk | ttk | 説明 |
background (bg) | ● | 背景色 | |
foreground (fg) | ● | 前景色 | |
disabledforeground | ● | 無効状態の前景色 | |
highlightbackground | ● | 外枠の色 (入力フォーカスなし) | |
highlightcolor | ● | 外枠の色 (入力フォーカスあり) | |
highlightthickness | ● | 外枠の幅 (入力フォーカス用) | |
selectbackground | ● | 選択項目の背景色 | |
selectborderwidth | ● | 選択項目の枠幅 (ピクセル単位 等) | |
selectforeground | ● | 選択項目の前景色 | |
その他 | tk | ttk | 説明 |
cursor | ● | マウスカーソル名 | |
name | ○ | インスタンス名 (省略:自動命名) 先頭に半角大文字は不可・ドットは不可 / フルパスで一意 〔 インスタンス識別 〕 | |
takefocus | ● | [Tab]キー等でのフォーカス移動の有無〔フォーカス関連メソッド〕 ・' ' (空文字列):自動設定 ・False:なし (スキップ) ・True:あり (タブストップ) |
凡例
●:各種方法で指定可能
○:コンストラクタでのみ指定可能
▲:config( ) 等でのみ指定可能
Config:コンストラクタ 及び config( ) 等で指定可能
Style:Style でのみ指定可能
Method:メソッドの引数で指定
Default:デフォルト値
:テーマ依存
○:コンストラクタでのみ指定可能
▲:config( ) 等でのみ指定可能
Config:コンストラクタ 及び config( ) 等で指定可能
Style:Style でのみ指定可能
Method:メソッドの引数で指定
Default:デフォルト値
:テーマ依存
色 | 説明 |
---|---|
'色名' | 色名:'red'・'green'・'blue'・'gray0'~'gray100'・'system~' 等 下記参照 Tcl8.6/Tk8.6 - Tk Commands - colors (同名色でも HTML5:カラー定義 と定義に差異あり) |
'#RGB' | 16進 4ビット |
'#RRGGBB' | 16進 8ビット |
'#RRRGGGBBB' | 16進 12ビット |
'#RRRRGGGGBBBB' | 16進 16ビット |
マウスカーソル名の詳細 ( cursor )
マウスカーソル名 | 説明 |
---|---|
'マウスカーソル名' | 下記参照 ('arrow'・'wait' 等) Tcl8.6/Tk8.6 - Tk Commands - cursors (英語) Tkinter 8.5 reference: a GUI for Python - Cursors (英語) |
外観の詳細 ( relief )
外観 | 説明 |
---|---|
FLAT | フラット |
GROOVE | 凹み枠 |
RAISED | 隆起 (凸) |
RIDGE | 隆起枠 (凸枠) |
SOLID | 実線 |
SUNKEN | 凹み |
メソッド
コンストラクタ | 備考 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Listbox(master=None, cnf={ }, **kw) | コンストラクタ master親 (tkinter.Tk【トップレベルウィンドウ】・コンテナウィジェット) cnf (辞書型引数)辞書型のオプション kw (キーワード引数)オプション (複数可) | ||||||||||
固有メソッド | 備考 | ||||||||||
共通 | 要素下記で要素指定 ・数値インデックス (0~) ・ACTIVE:アクティブ要素 ・ANCHOR:アンカー要素〔select_anchor【アンカー要素 設定】〕 ・END:最終要素 (index( )【要素インデックス・要素数の取得】・insert( )【要素挿入】:最終要素の次) ・'@x,y':ピクセル座標の要素 | ||||||||||
activate(index) | アクティブ要素の設定 index要素 | ||||||||||
bbox(index) | 指定要素の座標 戻り値座標のタプル (xオフセット, yオフセット, 幅, 高さ) index要素 | ||||||||||
curselection( ) | 選択要素の取得 戻り値選択要素番号 (0~) のタプル | ||||||||||
delete(first, last=None) | 要素の削除 first最初の要素 last最後の要素 (省略:1要素のみ) | ||||||||||
get(first, last=None) | 要素内容の取得 戻り値要素内容のタプル (該当要素なし:空文字列) first最初の要素 last最後の要素 (省略:1要素のみ) | ||||||||||
index(index) | 要素インデックス・要素数の取得 戻り値要素番号 (0~)・要素数 index要素 (END:要素数) | ||||||||||
insert(index, *elements) | 要素を直前に挿入 index要素 (END:最後) elements要素内容 (複数指定可) | ||||||||||
itemcget(index, option) | 要素オプション値の取得 index要素 optionオプション ( itemconfig( )【要素オプションの取得・設定】のオプション参照 ) | ||||||||||
itemconfig(index, cnf=None, **kw) itemconfigure(index, cnf=None, **kw) | 要素オプションの取得・設定 戻り値 (取得:オプション省略)辞書型のオプション 戻り値 (設定:オプション指定)無効 index要素 cnf下記オプション kw下記オプション
| ||||||||||
nearest(y) | 指定座標に近い要素インデックス取得 戻り値要素インデックス (0~) yy座標 | ||||||||||
scan_dragto(x, y) | 座標差分 10倍調整 (高速スクロール用) xx座標 yy座標 ( 通常 <Motion> イベントに関連付け ) | ||||||||||
scan_mark(x, y) | 座標記録 (高速スクロール用) xx座標 yy座標 ( 通常マウスボタン押下に関連付け ) | ||||||||||
see(index) | 指定要素が表示されるようにスクロール index要素 | ||||||||||
select_anchor(index) selection_anchor(index) | アンカー要素の設定 (以後 ANCHOR で参照可能) index要素 | ||||||||||
select_clear(first, last=None) selection_clear(first, last=None) | 指定範囲の要素を選択解除 first最初の要素 last最後の要素 (省略:1要素のみ) | ||||||||||
select_includes(index) selection_includes(index) | 要素の選択有無取得 戻り値選択状態 (1:選択 / 0:未選択) index要素 | ||||||||||
select_set(first, last=None) selection_set(first, last=None) | 指定範囲の要素を選択 first最初の要素 last最後の要素 (省略:1要素のみ) | ||||||||||
size( ) | 要素数の取得 戻り値要素数 | ||||||||||
xview(*args) | 水平方向スクロールコマンド処理 戻り値 (引数なし) 表示されている要素のスクロール位置 (0~1) のタプル (先頭要素, 最終要素) 戻り値 (引数あり)無効 argsコマンド と 引数 コマンドにより下記を呼び出し ・xview_moveto【水平方向のスクロール (位置指定)】 ・xview_scroll【水平方向のスクロール (単位指定)】 ※:Scrollbar【スクロールバー】等の関連ウィジェットの command【呼び出し関数】オプションに設定で、 関連ウィジェットの操作が反映 | ||||||||||
xview_moveto(fraction) | 水平方向のスクロール (位置指定) fraction位置 (0 ~ 1) | ||||||||||
xview_scroll(number, what) | 水平方向のスクロール (単位指定) number方向の整数値 (負数:左方向 / 正数:右方向) whatコマンド文字列 (UNITS:文字単位 / PAGES:ページ単位 / その他:左記の省略形) | ||||||||||
yview(*args) | 垂直方向スクロールコマンド処理 戻り値 (引数なし) 表示されている要素のスクロール位置 (0~1) のタプル (先頭要素, 最終要素) 戻り値 (引数あり)無効 argsコマンド と 引数 コマンドにより下記を呼び出し ・yview_moveto【垂直方向のスクロール (位置指定)】 ・yview_scroll【垂直方向のスクロール (単位指定)】 ※:Scrollbar【スクロールバー】等の関連ウィジェットの command【呼び出し関数】オプションに設定で、 関連ウィジェットの操作が反映 | ||||||||||
yview_moveto(fraction) | 垂直方向のスクロール (位置指定) fraction位置 (0 ~ 1) | ||||||||||
yview_scroll(number, what) | 垂直方向のスクロール (単位指定) number方向の整数値 (負数:上方向 / 正数:下方向) whatコマンド文字列 (UNITS:要素行単位 / PAGES:ページ単位 / その他:左記の省略形) | ||||||||||
共通メソッド (抜粋) 〔詳細はリンク先〕 | 備考 | ||||||||||
cget( 'option' ) widget['option'] | オプション値 取得 下の構文はオプション値の設定も可 | ||||||||||
config( ~ ) configure( ~ ) | オプション 設定・取得 | ||||||||||
pack( ~ ) | 配置 (パック形式) | ||||||||||
grid( ~ ) | 配置 (グリッド形式) | ||||||||||
place( ~ ) | 配置 (座標形式) |
例
作成
要素の追加
import tkinter as tk
# トップレベルウィンドウ作成
root = tk.Tk()
# Listbox
lst = ['item A', 'item B', 'item C']
var_list = tk.StringVar(value=lst)
listbox = tk.Listbox(
root,
listvariable=var_list,
height=0,
)
listbox.insert(tk.END, "Item 1")
listbox.insert(tk.END, "Item 2")
listbox.insert(tk.END, "Item 3")
listbox.pack(padx=10, pady=10)
# メインループ
root.mainloop()
要素の選択・選択要素の取得
import tkinter as tk
def func_copy():
select = listbox_from.curselection()
listbox_to.select_clear(0, tk.END)
for i in select:
listbox_to.select_set(i)
# トップレベルウィンドウ作成
root = tk.Tk()
# Listbox (from)
listbox_from = tk.Listbox(
root,
exportselection=False,
selectmode=tk.EXTENDED,
)
for i in range(10):
listbox_from.insert(tk.END, "Item_" + str(i))
listbox_from.select_set(2)
listbox_from.select_set(5)
listbox_from.select_set(8)
listbox_from.pack(side=tk.LEFT, padx=10, pady=10)
# Button
button = tk.Button(
root,
text="コピー\n\n選択要素の取得\n&\n要素選択",
command=func_copy,
)
button.pack(side=tk.LEFT, padx=10, pady=10)
# Listbox (to)
listbox_to = tk.Listbox(
root,
exportselection=False,
selectmode=tk.EXTENDED,
)
for i in range(10):
listbox_to.insert(tk.END, "Item_" + str(i))
listbox_to.pack(side=tk.LEFT, padx=10, pady=10)
# メインループ
func_copy()
root.mainloop()
スクロールバー関連付け
# scrolledlistbox.py
from tkinter import Frame, Listbox, Scrollbar, Pack, Grid, Place
from tkinter.constants import HORIZONTAL, NSEW
class ScrolledListbox(Listbox):
def __init__(self, master=None, **kw):
name = kw.get("name")
if name == None:
name = ""
self.frame = Frame(master, name=name)
self.frame.rowconfigure(0, weight=1)
self.frame.columnconfigure(0, weight=1)
self.vbar = Scrollbar(self.frame)
self.vbar.grid(row=0, column=1, sticky="NWS")
self.hbar = Scrollbar(self.frame, orient=HORIZONTAL)
self.hbar.grid(row=1, column=0, sticky="SWE")
kw.update({'yscrollcommand': self.vbar.set})
kw.update({'xscrollcommand': self.hbar.set})
Listbox.__init__(self, self.frame, **kw)
self.grid(row=0, column=0, sticky=NSEW)
self.vbar['command'] = self.yview
self.hbar['command'] = self.xview
text_meths = vars(Listbox).keys()
methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
methods = methods.difference(text_meths)
for m in methods:
if m[0] != '_' and m != 'config' and m != 'configure':
setattr(self, m, getattr(self.frame, m))
def forget_hbar(self):
self.hbar.grid_forget()
def __str__(self):
return str(self.frame)
import tkinter as tk
from scrolledlistbox import ScrolledListbox
# トップレベルウィンドウ作成
root = tk.Tk()
# ScrolledListbox (1)
listbox_1 = ScrolledListbox(
root,
exportselection=False,
)
for i in range(5):
listbox_1.insert(tk.END, str(i) + " Item")
listbox_1.select_set(1)
listbox_1.pack(side=tk.LEFT, padx=10, pady=10)
# ScrolledListbox (2)
listbox_2 = ScrolledListbox(
root,
exportselection=False,
)
for i in range(20):
listbox_2.insert(tk.END, str(i) + " Item")
listbox_2.select_set(1)
listbox_2.pack(side=tk.LEFT, padx=10, pady=10)
# ScrolledListbox (3)
listbox_3 = ScrolledListbox(
root,
exportselection=False,
)
for i in range(20):
listbox_3.insert(tk.END, str(i) + " Iteeeeeeeeeeeeeeeeeeeeem")
listbox_3.select_set(1)
listbox_3.pack(side=tk.LEFT, padx=10, pady=10)
# ScrolledListbox (4)
listbox_4 = ScrolledListbox(
root,
exportselection=False,
)
listbox_4.forget_hbar()
listbox_4.insert(tk.END, "forget_hbar( )")
for i in range(20):
listbox_4.insert(tk.END, str(i) + " Item")
listbox_4.select_set(0)
listbox_4.pack(side=tk.LEFT, padx=10, pady=10)
# メインループ
root.mainloop()
仮想イベント
import tkinter as tk
# イベント処理
def select_event(event):
var_label.set(str(event))
# トップレベルウィンドウ作成
root = tk.Tk()
# Label
var_label = tk.StringVar(value="var_label")
label = tk.Label(
root,
textvariable=var_label,
relief=tk.SUNKEN,
)
label.pack(side=tk.BOTTOM, fill=tk.X)
# Listbox
listbox = tk.Listbox(
root,
)
listbox.bind("<<ListboxSelect>>", select_event)
for i in range(10):
listbox.insert(tk.END, "Item_" + str(i))
listbox.pack(padx=10, pady=10)
# メインループ
root.mainloop()