本篇 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,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
3mylistbox = tk.Listbox(root)
mylistbox.insert(tk.END, 'apple','banana','orange','lemon','tomato')
mylistbox.pack()
如果要從 list 裡來初始化的話,可以搭配 for 迴圈來 insert 像這樣寫,1
2
3
4
5mylistbox = tk.Listbox(root)
mylist = ['apple','banana','orange','lemon','tomato']
for i in mylist:
mylistbox.insert(tk.END, i)
mylistbox.pack()
要按下按鈕就新增/插入一個選項的話,可以在按鈕事件裡寫 Listbox.insert()
要插入什麼選項,這邊示範按下按鈕就插入一個 1-100 隨機的數字,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 裡還有選項就刪除第一個選項,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.BROWSE
跟 tk.SINGLE
,預設是使用 tk.BROWSE
,在 selectmode 裡指定 tk.BROWSE
即可,使用下面兩種寫法是一樣的效果,tk.BROWSE
在滑鼠拖曳時會改變單選的選項,1
2
3mylistbox = 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 目前的選項,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.EXTENDED
或 selectmode=tk.MULTIPLE
選項,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 目前所有複選選項的文字並印出來,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 上,完整範例如下,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
4def listbox_event(event):
print(mylistbox.curselection())
index = mylistbox.curselection()
mylabel.configure(text=mylistbox.get(index))
以上就是 Python tkinter Listbox 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!