Listbox 列表選擇框
Listbox 是 tkinter 裡用來讓使用者可以從一串清單裡選擇的「列表輸入框」,這篇教學會介紹如何在 tkinter 視窗裡加入 Listbox 列表選擇框,並實作輸入資料後進行互動的程式。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
加入 Listbox
建立 tkinter 視窗物件後,透過 Listbox 方法,就能在視窗物件中建立 Listbox 列表選擇框,必要的參數有一個,第一個表示要加入的視窗物件,建立 Listbox 後使用 insert() 方法加入選項,最後再用 pack() 方法將其加入視窗中 ( 參考 pack 參數設定 ),下方的程式碼執行後,會在視窗裡加入一個具有三個選項的 Listbox ( 位置、大小和顏色都使用預設值 )。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
listbox = tk.Listbox(root) # 放入列表選擇框
listbox.insert(1, 'Apple') # 第一個選項
listbox.insert(2, 'Banana') # 第二個選項
listbox.insert(3, 'Orange') # 第三個選項
listbox.pack()
root.mainloop()
insert 的第一個參數為選項的位置,如果不知道位置但又希望選項按照順序插入,可以使用 tk.END 作為順序,就會將選項依序放在最後,如果使用 0,就會從第一個位置插入。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
listbox = tk.Listbox(root) # 放入列表選擇框
listbox.insert(tk.END, 'Apple') # 第一個選項
listbox.insert(tk.END, 'Banana') # 第二個選項
listbox.insert(tk.END, 'Orange') # 第三個選項
listbox.pack()
root.mainloop()
Listbox 參數設定
加入 Listbox 之後,可以透過 Listbox 的參數調整內容的樣式,下方列出 Listbox 和其他元件相同的參數:
參數 | 說明 |
---|---|
anchor | 擺放位置,可以設定 n、s、w、e、ne、nw、sw、se、center ( e 右,w 左,s 下,n 上 ),預設 center。 |
width | 寬度,單位是字元數。 |
height | 高度,單位是字元數。 |
bg/background | 背景顏色,可以使用十六進位色碼或顏色名稱。 |
fg/foreground | 文字顏色,可以使用十六進位色碼或顏色名稱。 |
font | 字型設定,包含字體、大小 ( px )、粗體 ( bold )、斜體 ( italic )。 |
justify | 多行文字的對齊方式,可以設定 left、right、center,預設 center。 |
cursor | 滑鼠移動到標籤的樣式,可以設定 arrow、circle、cross、plus...等,預設 arrow。 |
relief | 邊框樣式,可以設定 flat、sunken、raised、groove、ridge、solid,預設 flat。 |
bd/borderwidth | 邊框粗細,預設 1。 |
下方是 Listbox 列表選擇框行為相關的參數:
參數 | 說明 |
---|---|
listvariable | 綁定清單變數,方便動態存取 Listbox 內容。 |
selectmode | 選取模式,可以設定 browse ( 預設,等同單選 )、single ( 單選 )、multiple ( 多選 ) 和 extended ( 等同多選,但可用滑鼠拖曳選取 )。 |
selectbackground | 選取時的背景色。 |
xscrollcommand | 與 set() 方法搭配,將 Listbox 加上水平捲軸。 |
yscrollcommand | 與 set() 方法搭配,將 Listbox 加上垂直捲軸。 |
Listbox 操作方法
透過下列方法,可以進行 Listbox 列表選擇框的相關操作:
方法 | 參數 | 說明 |
---|---|---|
insert() | index, option | 在指定位置 ( index ) 加入選項 ( option )。 |
delete() | first, last=None | 刪除 first 到 last 之間的項目,如果沒有 last 則只會刪除 first 的項目。 |
get() | first, last=None | 取得 first 到 last 之間的項目,如果沒有 last 則只會取得 first 的項目。 |
size() | 回傳項目總數。 | |
curselection() | 以 tuple 格式回傳選取的項目索引。 | |
activate() | index | 選取 index 項目。 |
selection_set() | index | 設定 index 項目為被選取的狀態。 |
selection_includes() | index | 檢查 index 項目是否有被選取。 |
一次添加多個選項
如果有多個項目需要添加,可以先將項目設為串列的形式,再使用 for 迴圈依序加入。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
listbox = tk.Listbox(root)
menu = ['Apple','Banana','Orange','Grap','Papaya','Coconut'] # 建立選單的串列
for i in menu:
listbox.insert(tk.END, i) # 使用 for 迴圈添加選項
listbox.pack()
root.mainloop()
除了使用迴圈,也可以透過 listvariable 指定變數,當變數內容為清單項目時,就會自動將清單項目加入。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
menu = tk.StringVar() # 設定 tk 文字變數
menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut')) # 加入清單內容
listbox = tk.Listbox(root, listvariable=menu) # 設定 listvariable=a
listbox.pack()
root.mainloop()
點擊按鈕,顯示清單選擇項目
參考「Label 標籤」和「Button 按鈕」文章,搭配 Listbox 的 curselection() 取得選取項目以及 get() 取得項目內容,就能在點擊按鈕時,透過 Label 顯示 Listbox 選取的項目。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
# 定義 Label 顯示選取內容的函式
def show():
n, = listbox.curselection() # 取得項目索引值,因為是單選,回傳 (i,),所以使用 n, 取值
text.set(listbox.get(n)) # 設定文字變數內容為該索引值對應的內容
text = tk.StringVar() # 設定文字變數
label = tk.Label(root, textvariable=text) # 放入 Label
label.pack()
menu = tk.StringVar()
menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut'))
listbox = tk.Listbox(root, listvariable=menu, height=8)
listbox.pack()
btn = tk.Button(root, text='顯示', command=show) # 放入 Button,設定 command 參數
btn.pack()
Listbox 加入捲軸
Listbox 要加入捲軸比較複雜,需要先添加 Frame 頁框元件,再將 Listbox 和額外添加的 Scrollbar 捲軸元件放在 Frame 頁框裡,接著將 Listbox 和 Scrollbar 綁定,就能實現 Listbox 捲軸效果。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
frame = tk.Frame(root, width=15) # 加入頁框元件,設定寬度
frame.pack()
scrollbar = tk.Scrollbar(frame) # 在頁框中加入捲軸元件
scrollbar.pack(side='right', fill='y') # 設定捲軸的位置以及填滿方式
menu = tk.StringVar()
menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut','Pear','Nuts'))
# 在頁框中加入 Listbox 元件,設定 yscrollcommand = scrollbar.set
listbox = tk.Listbox(frame, listvariable=menu, height=6, width=15, yscrollcommand = scrollbar.set)
listbox.pack(side='left', fill='y') # 設定 Listbox 的位置以及填滿方式
scrollbar.config(command = listbox.yview) # 設定 scrollbar 的 command = listbox.yview
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~