Tkinter 元件詳解之Listbox

Listbox(列表框)元件用於顯示一個選擇列表。Listbox 只能包含文字專案,並且所有的專案都需要使用相同的字型和顏色。根據元件的配置,使用者可以從列表中選擇一個或多個選項。

何時使用 Listbox 元件?

Listbox 元件通常被用於顯示一組文字選項,Listbox 元件跟 Checkbutton 和 Radiobutton 元件類似,不過 Listbox 是以列表的形式來提供選項的(後兩個是通過按鈕的形式)。

用法

當你建立一個 Listbox 元件的時候,它是空的,所以第一件要做的事就是新增一行或多行文字進去。我們使用 insert() 方法新增文字,該方法有兩個引數:第一個引數是插入的索引號,第二個引數是插入的字串。索引號通常是專案的序號(0 是列表中第一項的序號)。

不過你也可以使用一些特殊的索引號:比如 ACTIVE 表示選中的專案(如果 Listbox 允許多選,那麼它表示最後一個被選中的專案);又如 END 表示 Listbox 的最後一行,所以當要插入一個專案到列表時可以使用 END:

import tkinter as tk

master = tk.Tk()

# 建立一個空列表
theLB = tk.Listbox(master)
theLB.pack()

# 往列表裡新增資料
for item in ["雞蛋", "鴨蛋", "鵝蛋", "李狗蛋"]:
        theLB.insert("end", item)


master.mainloop()

使用 delete() 方法刪除列表中的專案,最常用的操作是刪除列表中的所有專案(更新列表時你需要做的事兒):

listbox.delete(0, "end")
listbox.insert("end", newitem) #插入新的專案

當然你也可以刪除指定的專案,下邊例子使用一個獨立按鈕來刪除 ACTIVE 狀態的專案:

import tkinter as tk

master = tk.Tk()

# 建立一個空列表
theLB = tk.Listbox(master)
theLB.pack()

# 往列表裡新增資料
for item in ["雞蛋", "鴨蛋", "鵝蛋", "李狗蛋"]:
        theLB.insert("end", item)
        
theButton = tk.Button(master, text="刪除", command=lambda x=theLB: x.delete("active"))
theButton.pack()

master.mainloop()

     

Listbox 元件根據 selectmode 選項提供了四種不同的選擇模式:"single"(單選)、"browse"(也是單選,但拖動滑鼠或通過方向鍵可以直接改變選項)、"multiple"(多選)和 "extended"(也是多選,但需要同時按住 Shift 鍵或 Ctrl 鍵或拖拽滑鼠實現)。預設是 "browse"。

引數

Listbox(master=None, **options) (class)

master -- 父元件

**options -- 元件選項,下方表格詳細列舉了各個選項的具體含義和用法:

選項 含義
background 1. 設定背景顏色
2. 預設值由系統指定
bg 跟 background 一樣
borderwidth 1. 指定 Listbox 的邊框寬度
2. 預設值由系統指定,通常是 2 畫素
bd 跟 borderwidth 一樣
cursor 1. 指定當滑鼠在 Listbox 上飄過的時候的滑鼠樣式
2. 預設值由系統指定
exportselection 1. 指定選中的專案文字是否可以被複制到剪貼簿
2. 預設值是 True
3. 可以修改為 False 表示不允許複製專案文字
font 1. 指定 Listbox 中文字的字型
2. 預設值由系統指定
foreground 1. 設定 Listbox 的文字顏色
2. 預設值由系統指定
fg 跟 foreground 一樣
height 1. 設定 Listbox 顯示的行數(不是畫素)
2. 預設值是 10
highlightbackground 1. 指定當 Listbox 沒有獲得焦點的時候高亮邊框的顏色
2. 預設值由系統指定,通常是標準背景顏色
highlightcolor 1. 指定當 Listbox 獲得焦點的時候高亮邊框的顏色
2. 預設值由系統指定
highlightthickness 1. 指定高亮邊框的寬度
2. 預設值是 1
listvariable 1. 指向一個 StringVar 型別的變數,該變數存放 Listbox 中所有的專案
2. 在 StringVar 型別的變數中,用空格分隔每個專案,例如 var.set("雞蛋 鴨蛋 鵝蛋 李狗蛋")
relief 1. 指定邊框樣式
2. 預設值是 "sunken"
selectbackground 1. 指定當某個專案被選中的時候背景顏色
2. 預設值由系統指定
selectborderwidth 1. 指定當某個專案被選中的時候邊框的寬度
2. 預設是由 selectbackground 指定的顏色填充,沒有邊框
3. 如果設定了此選項,Listbox 的每一項會相應變大,被選中項為 "raised" 樣式
selectforeground 1. 指定當某個專案被選中的時候文字顏色
2. 預設值由系統指定
selectmode 1. 決定選擇的模式
2. 四種不同的選擇模式:"single"(單選)、"browse"(也是單選,但拖動滑鼠或通過方向鍵可以直接改變選項)、"multiple"(多選)和 "extended"(也是多選,但需要同時按住 Shift 鍵或 Ctrl 鍵或拖拽滑鼠實現)
3. 預設是 "browse"
setgrid 1. 指定一個布林型別的值,決定是否啟用網格控制
2. 預設值是 False
takefocus 1. 指定該元件是否接受輸入焦點(使用者可以通過 tab 鍵將焦點轉移上來)
2. 預設值是 True
width 1. 設定 Listbox 的寬度(單位是文字單元)
2. 文字單元是英文字母的平均寬度(所以如果該選項設定為 2,那麼是無法容納"ww"這兩個寬度大於平均寬度的字母的)
3. 預設值是 20
xscrollcommand 1. 為 Listbox 元件新增一條水平滾動條
2. 將此選項與 Scrollbar 元件相關聯即可
yscrollcommand 1. 為 Listbox 元件新增一條垂直滾動條
2. 將此選項與 Scrollbar 元件相關聯即可

方法

activate(index)
-- 將給定索引號對應的選項啟用(在其文字下方畫一條下劃線)

bbox(index)
-- 返回給定索引號對應的選項的邊框
-- 返回值是一個以畫素為單位的 4 元祖表示邊框:(xoffset, yoffset, width, height)
-- xoffset 和 yoffset 表示距離左上角的偏移位置
-- 返回的 width 是文字的實際寬度(畫素為單位)
-- 如果指向的選項是不可見的,那麼返回值是 None

curselection()
-- 返回一個元組,包含被選中的選項的序號(從 0 開始)
-- 如果沒有選中任何選項,返回一個空元組

delete(first, last=None)
-- 刪除引數 first 到 last 範圍內(包含 first 和 last)的所有選項
-- 如果忽略 last 引數,表示刪除 first 引數指定的選項

get(first, last=None)
-- 返回一個元組,包含引數 first 到 last 範圍內(包含 first 和 last)的所有選項的文字
-- 如果忽略 last 引數,表示返回 first 引數指定的選項的文字

index(index)
-- 返回與 index 引數相應的選項的序號(例如 lb.index("end"))

insert(index, *elements)
-- 新增一個或多個專案到 Listbox 中
-- 使用 lb.insert("end") 新增新選項到末尾

itemcget(index, option)
-- 獲得 index 引數指定的專案對應的選項(由 option 引數指定)

itemconfig(index, **options)
-- 設定 index 引數指定的專案對應的選項(由可變引數 **option 指定)

nearest(y)
-- 返回與給定引數 y 在垂直座標上最接近的專案的序號

scan_dragto(x, y)
-- 見下方 scan_mark(x, y)

scan_mark(x, y)
-- 使用這種方式來實現 Listbox 內容的滾動
-- 需要將滑鼠按鈕事件及當前滑鼠位置繫結到 scan_mark(x, y) 方法,然後再將 <motion> 事件及當前滑鼠位置繫結到 scan_dragto(x, y) 方法,就可以實現 Listbox 在當前位置和 sacn_mack(x, y) 指定的位置 (x, y) 之間滾動

see(index)
-- 調整列表框的位置,使得 index 引數指定的選項是可見的

select_anchor(index)
-- 與 selection_anchor(index) 相同,見下方解釋

select_clear(first, last=None)
-- 與 selection_clear(first, last=None) 相同,見下方解釋

select_includes(index)
-- 與 selection_includes(index) 相同,見下方解釋

select_set(first, last=None)
-- 與 selection_set(first, last=None) 相同,見下方解釋

selection_anchor(index)
-- 在 index 引數的位置下一個錨點,此後你就可以通過特殊索引 "anchor" 訪問

selection_clear(first, last=None)
-- 取消引數 first 到 last 範圍內(包含 first 和 last)選項的選中狀態
-- 如果忽略 last 引數,則只取消 first 引數指定選項的選中狀態

selection_includes(index)
-- 返回 index 引數指定的選項的選中狀態
-- 返回 1 表示選中,返回 0 表示未選中

selection_set(first, last=None)
-- 設定引數 first 到 last 範圍內(包含 first 和 last)選項為選中狀態
-- 如果忽略 last 引數,則只設置 first 引數指定選項為選中狀態

size()
-- 返回 Listbox 元件中選項的數量

xview(*args)
-- 該方法用於在水平方向上滾動 Listbox 元件的內容,一般通過繫結 Scollbar 元件的 command 選項來實現(具體操作參考:Scrollbar
-- 如果第一個引數是 "moveto",則第二個引數表示滾動到指定的位置:0.0 表示最左端,1.0 表示最右端
--如果第一個引數是 "scroll",則第二個引數表示滾動的數量,第三個引數表示滾動的單位(可以是 "units" 或 "pages"),例如:xview("scroll", 3, "pages")表示向右滾動三行

xview_moveto(fraction)
-- 跟 xview("moveto", fraction) 一樣

xview_scroll(number, what)
-- 跟 xview("scroll", number, what) 一樣

yview(*args)
-- 該方法用於在垂直方向上滾動 Listbox 元件的內容,一般通過繫結 Scollbar 元件的 command 選項來實現(具體操作參考:Scrollbar
-- 如果第一個引數是 "moveto",則第二個引數表示滾動到指定的位置:0.0 表示最頂端,1.0 表示最底端
-- 如果第一個引數是 "scroll",則第二個引數表示滾動的數量,第三個引數表示滾動的單位(可以是 "units" 或 "pages"),例如:yview("scroll", 3, "pages") 表示向下滾動三頁

yview_moveto(fraction)
-- 跟 yview("moveto", fraction) 一樣

yview_scroll(number, what)
-- 跟 yview("scroll", number, what) 一樣