Tkinter 元件詳解(八):Listbox
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) 一樣