Tkinter列表框和组合框控件

列表框,即 Listbox。在使用 Tkinter 进行 GUI 编程的过程中,如果需要用户自己进行选择时就可以使用列表框控件。列表框中的选项可以是多个条目,也可以是单个唯一条目,但常用于多个条目

常用方法

activate(index)
将给定索引号对应的选项激活,即文本下方画一条下划线

bbox(index)
返回给定索引号对应的选项的边框,返回值是一个以像素为单位的 4 元祖表示边框:(xoffset, yoffset, width, height), xoffset 和 yoffset 表示距离左上角的偏移位置

curselection()
返回一个元组,包含被选中的选项序号(从 0 开始)

delete(first, last=None)
删除参数 first 到 last 范围内(包含 first 和 last)的所有选项

get(first, last=None)
返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本

index(index)
返回与 index 参数相应选项的序号

itemcget(index, option)
获得 index 参数指定的项目对应的选项(由 option 参数指定)

itemconfig(index, **options)

设置 index 参数指定的项目对应的选项(由可变参数 option 指定)

nearest(y)
返回与给定参数 y 在垂直坐标上最接近的项目的序号

selection_set(first, last=None)
设置参数 first 到 last 范围内(包含 first 和 last)选项为选中状态,使用 selection_includes(序号) 可以判断选项是否被选中。

size()
返回 Listbox 组件中选项的数量

xview(*args)

该方法用于在水平方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现。 如果第一个参数是 “moveto”,则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端;如果第一个参数是 “scroll”,则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 “units” 或 “pages”)
例如:xview(“scroll”, 2, “pages”)表示向右滚动二行。

yview(*args)

该方法用于在垂直方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现

属性

除了共有属性之外,列表框控件也有一些其他属性

listvariable

  1. 指向一个 StringVar 类型的变量,该变量存放 Listbox 中所有的项目
  2. 在 StringVar 类型的变量中,用空格分隔每个项目,例如 var.set(“c c++ java python”)

selectbackground
指定当某个项目被选中的时候背景颜色,默认值由系统指定

selectborderwidth

  1. 指定当某个项目被选中的时候边框的宽度
  2. 默认是由 selectbackground 指定的颜色填充,没有边框
  3. 如果设置了此选项,Listbox 的每一项会相应变大,被选中项为 “raised” 样式

selectforeground
指定当某个项目被选中的时候文本颜色,默认值由系统指定

selectmode
决定选择的模式,tk 提供了四种不同的选择模式,分别是:”single”(单选)、”browse”(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、”multiple”(多选)和 “extended”(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现),默认是 “browse”

setgrid
指定一个布尔类型的值,决定是否启用网格控制,默认值是 False

takefocus
指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来),默认值是 True

xscrollcommand
为 Listbox 组件添加一条水平滚动条,将此选项与 Scrollbar 组件相关联即可

yscrollcommand
为 Listbox 组件添加一条垂直滚动条,将此选项与 Scrollbar 组件相关联即可

eg.

1
2
3
4
5
6
7
8
9
10
from tkinter import *
win = Tk()
win.geometry('400x200')
# 创建列表选项
listbox1 =Listbox(win)
listbox1.pack()
# i表示索引值,item 表示值,根据索引值的位置依次插入
for i,item in enumerate(["C","C++","C#","Python","Java"]):
listbox1.insert(i,item)
win.mainloop()

除了上述使用 enumerate() 来实现选项插入的方法外,还可以使用 “end” 实现,它表示将选项插入到最后一个位置,所以“Java”一定会被插入到最后一个位置上,而之前的选项会依次向前排列

1
2
3
4
5
6
7
8
root = tk.Tk()
root.geometry("400x400+500+100")
list =tk.Listbox(root,selectbackground="#AAAAFF")
list.pack()
n1 = ["张三", "李四","王五"]
for i in n1:
list.insert('end',i)
root.mainloop()
  1. 增加滚动条和删除功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from logging import RootLogger
import tkinter as tk
from turtle import right
root = tk.Tk()
s = tk.Scrollbar(root)
s.pack(side=tk.RIGHT,fill=tk.Y)
root.geometry("400x400+500+100")
list =tk.Listbox(root,selectbackground="#AAAAFF",selectmode = tk.MULTIPLE,height =5, yscrollcommand = s.set)
list.pack()
s.config(command = list.yview)
n1 = ["张三", "李四","王五",'老四',"小路","康康","小小","美美","小杨"]
for i in n1:
list.insert('end',i)
bt = tk.Button(root,text='删除',command = lambda x = list:x.delete(tk.ACTIVE))
bt.pack(side = tk.BOTTOM)
root.mainloop()
  1. StringVar() 添加列表选项

StringVar() 方法动态地获取列表框中的选项

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
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.geometry('400x180')
var1 = tk.StringVar()
l = tk.Label(window, bg='#AAAAFF', font=('微软雅黑', 15), width=20, textvariable=var1)
l.pack()
def click_button():
# 使用 curselection来选中文本
try:
val = lb.get(lb.curselection())
var1.set(val)
except Exception as e:
e = '发现一个错误'
messagebox.showwarning(e,'没有选择任何条目')

b1 = tk.Button(window, text='获取当前选项', command=click_button)
b1.pack()
var2 = tk.StringVar()
lb = tk.Listbox(window, listvariable=var2)
items = ["C", "Java", "Python", "C#", "Golang", "Runby"]
for i in items:
lb.insert('end', i)
lb.pack()
window.mainloop()