Python tkinter Listbox 用法與範例

本篇 ShengYu 介紹 Python tkinter Listbox 列表框用法與範例,Listbox 列表框是可以顯示一些選項的 UI Widget,這些選項可以讓使用者單選的方式選取也可以複選的方式選取。

以下的 Python tkinter Listbox 用法與範例將分為這幾部分,

  • tkinter Listbox 基本用法
  • tkinter Listbox 新增/插入選項
  • tkinter Listbox 刪除選項
  • tkinter Listbox 單選與複選模式
  • tkinter 取得目前 Listbox 的選項
  • tkinter Listbox 綁定事件

那我們開始吧!

tkinter Listbox 基本用法

這邊示範 tkinter Listbox 基本用法,建立一個基本的 Listbox 後,我們就來新增 Listbox 裡的選項,這邊是使用 Listbox.insert() 來插入選項,tk.END 是指向尾端插入,要向頭端插入的話就改成 0,

python3-listbox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'apple')
mylistbox.insert(tk.END, 'banana')
mylistbox.insert(tk.END, 'orange')
mylistbox.insert(tk.END, 'lemon')
mylistbox.insert(tk.END, 'tomato')
mylistbox.pack()

root.mainloop()

結果圖如下,

tkinter Listbox 新增/插入選項

上述範例已經介紹了 tkinter Listbox 基本用法以及插入選項的用法了,插入選項除了上述範例的寫法外,你也可以在 Listbox.insert() 裡一次把要插入的選項都放進去,像這樣寫,

1
2
3
mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'apple','banana','orange','lemon','tomato')
mylistbox.pack()

如果要從 list 裡來初始化的話,可以搭配 for 迴圈來 insert 像這樣寫,

1
2
3
4
5
mylistbox = tk.Listbox(root)
mylist = ['apple','banana','orange','lemon','tomato']
for i in mylist:
mylistbox.insert(tk.END, i)
mylistbox.pack()

要按下按鈕就新增/插入一個選項的話,可以在按鈕事件裡寫 Listbox.insert() 要插入什麼選項,這邊示範按下按鈕就插入一個 1-100 隨機的數字,

python3-listbox2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from random import randint

def button_event():
mylistbox.insert(tk.END, str(randint(1, 100)))

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'hello world')
mylistbox.pack()
tk.Button(root, text='insert', command=button_event).pack()

root.mainloop()

結果圖如下,

tkinter Listbox 插入元素時預設不會自動滾到底,如果想要 Listbox 插入元素自動滾動到底的話需要搭配 Scrollbar,這部份以後有機會再來作介紹。

tkinter Listbox 刪除選項

tkinter Listbox 要刪除選項的話是使用 Listbox.delete() 函式,在 Listbox.delete() 函式裡放入要刪除選項的索引值,以下示範按下按鈕時如果 Listbox 裡還有選項就刪除第一個選項,

python3-listbox3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
if mylistbox.size() > 0:
mylistbox.delete(0)

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='delete', command=button_event).pack()

root.mainloop()

如果要刪除使用者選取的選項時,可以透過 Listbox.curselection() 函式取得目前 Listbox 的選項再刪除該選項即可,取得目前 Listbox 的選項這部份在後面會介紹到。

tkinter Listbox 單選與複選模式

tkinter Listbox 預設是單選模式,單選模式有兩種,分別為 tk.BROWSEtk.SINGLE,預設是使用 tk.BROWSE,在 selectmode 裡指定 tk.BROWSE 即可,使用下面兩種寫法是一樣的效果,tk.BROWSE 在滑鼠拖曳時會改變單選的選項,

1
2
3
mylistbox = tk.Listbox(root)
# or
mylistbox = tk.Listbox(root, selectmode=tk.BROWSE)

tkinter Listbox 另一種單選模式 tk.SINGLE 是滑鼠拖曳時會不會改變單選選項,

1
mylistbox = tk.Listbox(root, selectmode=tk.SINGLE)

tkinter Listbox 複選的話有兩種,一種是滑鼠單擊選項就會複選,這種為 tk.MULTIPLE,寫法如下,

1
mylistbox = tk.Listbox(root, selectmode=tk.MULTIPLE)

tkinter Listbox 另一種複選模式是滑鼠單擊選項是單選,滑鼠拖曳選項才會是複選,這種為 tk.EXTENDED,這也是我們比較熟悉的複選模式,寫法如下,

1
mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)

tkinter 取得目前 Listbox 的選項

tkinter 要取得目前 Listbox 的選項的話,可以用 Listbox.curselection() 函式來取得使用者目前在 Listbox 中選擇的選項索引值 index,而 Listbox.curselection() 回傳的變數型態是 tuple,例如:如果選擇了第一個選項會得到 (0,),選擇了第二個選項會得到 (1,),依此類推,如果都沒有選擇的話會得到一個空的 tuple (),以下範例是按下按鈕時印出 Listbox 目前的選項,

python3-listbox4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

輸出結果如下,

1
(2,)

結果圖如下,

Listbox 如果是複選的話 Listbox.curselection() 會回傳複選的 tuple,例如:如果選擇了第一個選項跟第二個選項會得到 (0, 1),如果選擇了第一個選項跟第三個選項跟第五個選項會得到 (0, 2, 4),以此類推,這也就是 Listbox.curselection() 為什麼回傳的變數型態是 tuple 的原因,複選模式在建立 Listbox 時就可以指定 selectmode=tk.EXTENDEDselectmode=tk.MULTIPLE 選項,

python3-listbox5.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

輸出結果如下,

1
(0, 2, 4)

結果圖如下,

tkinter Listbox 如果要取得選項的文字的話,可以使用 Listbox.get(index) 帶入索引值,例如:Listbox.get(0) 是取得 Listbox 第一個選項文字,如果 Listbox.get() 不帶入任何索引值的話就會取得所有選項的文字列表 list,以下範例示範按下按鈕取得 Listbox 目前所有複選選項的文字並印出來,

python3-listbox6.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def button_event():
# print(type(mylistbox.curselection()))
print(mylistbox.curselection())
for i in mylistbox.curselection():
print(mylistbox.get(i))

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylistbox = tk.Listbox(root, selectmode=tk.EXTENDED)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.pack()
tk.Button(root, text='get current selection', command=button_event).pack()

root.mainloop()

tkinter Listbox 綁定事件

如果希望 tkinter Listbox 改變選擇選項時獲得通知的話就需要 Listbox 綁定事件,使用 Listbox.bind() 設定 <<ListboxSelect>> 事件對應的事件處理函式即可,如下範例中的 listbox_event() 函式,當改變 Listbox 選項時就可以在 listbox_event() 函式裡取得事件的 widget 也就是 Listbox,再將該選項的文字設定到 Label 上,完整範例如下,

python3-listbox7.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk

def listbox_event(event):
object = event.widget
# print(type(object.curselection()))
print(object.curselection())
index = object.curselection()
mylabel.configure(text=object.get(index))

root = tk.Tk()
root.title('my window')
root.geometry('200x180')

mylabel = tk.Label(root)
mylabel.pack()

mylistbox = tk.Listbox(root)
for i in ['apple','banana','orange','lemon','tomato']:
mylistbox.insert(tk.END, i)
mylistbox.bind("<<ListboxSelect>>", listbox_event)
mylistbox.pack()

root.mainloop()

結果圖如下,

listbox_event() 裡不從 event.widget 裡取得 Listbox 的話,直接改用我們例子中的 mylistbox 來操作也是可以的,如下範例所示,

1
2
3
4
def listbox_event(event):
print(mylistbox.curselection())
index = mylistbox.curselection()
mylabel.configure(text=mylistbox.get(index))

以上就是 Python tkinter Listbox 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
Python 新手入門教學懶人包
Python tkinter 新手入門教學