Listbox组件,用列表框的形式显示出选项,并且支持滚动条操作。所以更适用于提供大量选项。
-
from tkinter import *
-
master = Tk()
-
theLB = Listbox(master)
-
theLB.pack()
-
#theLB.insert(0, '') #向Listbox里添加选项,下标从零开始。最后可以用END
-
for item in ['张三', '李四', '王五']:
-
theLB.insert(END, item) #END表示最后一个。里面什么都没有时,END是0;插入一个后,END是1
-
'''
-
theLB.delete(0, END)
-
#删除Listbox里所有的选项。删除操作有两个参数:起始位置和结束位置
-
#如果只有一个参数,就指定删除参数对应的选项
-
'''
-
#添加按钮组件选中哪个按下删除哪个
-
theButton = Button(master, text='删除它', \
-
command=lambda x=theLB:x.delete(ACTIVE)) #ACTIVE表示当前选中的值
-
theButton.pack()
-
mainloop()
Listbox组件根据selectmode选项提供了四种不同的选择模式:SINGLE(单选)、BROWSE(也是单选,但是拖动鼠标或通过方向键可以直接改变选项)、MUTIPLE(多选)和EXTENDED(也是多选,但需要同时按住Shift键或Ctrl键或拖拽鼠标实现)。默认是BROWSE。
Listbox组件默认最多只能显示10个项目,如果有11个项目怎么解决?
可以通过在Listbox内滑动鼠标滚轮使最后一个现身,但这样很容易被忽略。
有两个方法可以避免:
①修改height选项。height选项是用来设置Listbox显示的行数(不是像素),其默认值是10
但是如果要显示项目过多,比如说1000个,修改height就不太合适了,因为总不能显示1000行
②可以为Listbox组件添加滚动条。
Scrollbar滚动条组件:
滚动条组件虽然是一个独立的组件,但几乎都是与其他组件一起配合使用。
为了在某个组件上安装垂直滚动条,你需要做两件事:
1.设置该组件的yscrollcommand选项为Scrollbar组件的set()方法
2.设置Scrollbar组件的command选项为该组件的yview()方法
下面是一个在Listbox里添加滚动条的例子:
-
from tkinter import *
-
root = Tk()
-
sb = Scrollbar(root)
-
sb.pack(side=RIGHT, fill=Y) #把滚动条加到右边去,填充整个y轴
-
lb = Listbox(root, yscrollcommand=sb.set)
-
#在Listbox里滑动鼠标滚轮时调用set方法,同时修改滚动条的位置
-
for i in range(1000):
-
lb.insert(END, i)
-
lb.pack(side=LEFT, fill=BOTH)
-
#要与滚动条互通互连,要设置滚动条的command选项
-
sb.config(command=lb.yview) #config方法设置某个选项的值
-
#yview方法是Listbox里的默认方法,方法已经设置好怎么显示垂直滚动对应的内容变化
-
#拖动垂直滚动条时调用yview
-
mainloop()
既然说到了滚动条,就继续来说说和滚动条组件很相似的一个组件Scale组件。
Scale组件主要通过滑块来表示某个范围内的一个数字。可以设置选项范围和分辨率(分辨率指的是步长,也就是精度)
-
from tkinter import *
-
#当我们希望用户输入某个范围内的数字的时候,可能会使用Entry组件,但是Entry组件并不能限制一个范围
-
root = Tk()
-
s1 = Scale(root, from_=0, to=42) #有两个参数from和to,但是from参数和Python的关键字冲突了,所以加个下横线
-
s1.pack()
-
s2 = Scale(root, from_=0, to=200, orient=HORIZONTAL) #默认Scale是垂直的,可以修改orient参数成水平的
-
s2.pack()
-
#获取滑块当前位置使用的是get方法
-
def show():
-
print(s1.get(), s2.get())
-
Button(root, text='获取位置', command=show).pack()
-
mainloop()
可以通过设置选项tickinterval和resolution改变步长和精度:
-
from tkinter import *
-
root = Tk()
-
#tickinterval=5每5个步长显示刻度
-
#resolution设置每次移动多少个长度,等于5的话,每次改变只能改变5
-
#设置length长度,不然都堆在一起了
-
s1 = Scale(root, from_=0, to=42, tickinterval=5, resolution=5, length=200).pack()
-
s2 = Scale(root, from_=0, to=200, tickinterval=10, orient=HORIZONTAL, length=600).pack()
-
mainloop()