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()
微信扫码关注
抖音扫码关注