##Listbox
(我们知道,单选的话,我们用 Radiobutton,多选的话,用Checkbutton,如果说提供的选项非常多,比如说选择你所在的城市,那么全国有好几百个城市,使用 Radiobutton 和 Checkbutton 这些组件直接导致的结果就是用户的界面根本就不够存放那么多按钮,这时候这个时候需要用到 Listbox 组件。)
※Listbox:Listbox 是用列表框的形式给显示出来的,并且支持滚动条操作,所以对于诸如提供大量的选项这样的情况会更适用一些。
from tkinter import *
master = Tk()
theLB = Listbox(master)
theLB.pack()
mainloop()
可以看到现在这个Listbox是空的,没有任何选项,我们可以用使用insert()方法给他添加选项
from tkinter import *
master = Tk()
theLB = Listbox(master)
theLB.pack()
theLB.insert(0,"java")
mainloop()
(解析:这里是使用insert()方法添加,他有两个参数,第一参数就是表示添加的位置,0表示第一个位置,第二个参数就是要添加的内容)
接着还可以用insert方法的END(要大写)参数来给他添加,end表示最后一个位置
对于比较多的选项,我们还可以用循环来进行添加
from tkinter import *
master = Tk()
theLB = Listbox(master)
theLB.pack()
eggs = ["鸡蛋","鸭蛋","鹅蛋","二狗蛋","没有蛋"]
for item in eggs:
theLB.insert(END,item)
mainloop()
(解析:insert(END,item)表示,每次都插到END的位置,END就是每一项的最后,刚开始里面什么都没有的时候END是0,插入鸡蛋之后END变成1,再插入鸭蛋END变成2,它事实上就是一个变量,存放的是最后一个位置)
我们可以使用 delete() 方法删除里边的元素,它有两个参数,第一个是起始位置,第二个是结束位置。如果只给定一个参数的话,就是指定这个参数对应的项目。
做个小案例:添加一个独立的删除按钮,选中其中一个然后点击这个删除按钮,把对应的内容删除
from tkinter import *
master = Tk()
theLB = Listbox(master)
theLB.pack()
eggs = ["鸡蛋","鸭蛋","鹅蛋","二狗蛋","没有蛋"]
for item in eggs:
theLB.insert(END,item)
theButton = Button(master,text = "删除",\
command = lambda x=theLB:x.delete(ACTIVE))
theButton.pack()
mainloop()
(解析:首先添加了一个theButton按钮,然后按钮肯定一个command,这里使用lambda表达式,冒号前边是参数,冒号后边是返回值,这个参数我们把它叫做x,因为是要删除Lisbox里面的内容,所以把Lisbox的实例化对象theLB作为对象传入,然后就是调用delete方法,里面的参数是ACTIVE,跟END一样,表示当前选中的值)
Listbox 组件根据 selectmode 选项提供了四种不同的选择模式:“single”(单选)、“browse”(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、“multiple”(多选)和 “extended”(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)。默认是 “browse”。(不加引号的时候需要大写才有效)
(可以看到SINGLE就是纯粹的单选)
因为Listbox 默认只能显示 10个项目,所以需要使用height 选项来改善一下
from tkinter import *
master = Tk()
theLB = Listbox(master,selectmode = "extended")
theLB.pack()
for item in range(11):
theLB.insert(END,item)
mainloop()
(可以看到默认只能显示 10个项目,如果下面还有就需要用鼠标滚轮往下滑一下,这样忘往很容易被用户忽略,你又没说下面还有没有,别人以为没有,可能就没滑滚轮的意识)
所以可以通过height选项来设置Listbox显示的行数
##Scrollbar
(刚刚说修改 height 选项的方法可以达到我们的目的,但是如果项目太多,比如说我们要显示 1000 个,这个方法显然就不适用了,总不能显示一千行吧,屏幕也没那么大,更灵活的方法就是为 Listbox 添加滚动条。)
※Scrollbar:Scrollbar(滚动条)组件用于滚动一些组件的可见范围,根据方向可分为垂直滚动条和水平滚动条。Scrollbar 组件常常被用于实现文本、画布和列表框的滚动。
(滚动条虽然是一个独立的组件存在,但它几乎都是与其他组件配合使用)
为了在某个组件上安装垂直滚动条,你必须要做两件事:
1、设置该组件(需要安装的组件)的 (水平)xscrollbarcommand 或者(垂直) yscrollbarcommand 选项为 Scrollbar 组件 的 set() 方法。
2、设置 Scrollbar 组件 的 command 选项 为该组件的 (水平)xview() 或者 (垂直)yview() 方法。
from tkinter import *
root = Tk()
sb = Scrollbar(root)
sb.pack()
mainloop()
先来见个面
可以通过设置pack的side选项,让他移到右边,然后再来个Y轴填充更好看
可以看到就一个滚动条太孤单了,来增加一个 Listbox:
from tkinter import *
root = Tk()
sb = Scrollbar(root)
sb.pack(side=RIGHT,fill=Y)
lb = Listbox(root,yscrollcommand=sb.set)
for i in range(1000):
lb.insert(END,i)
lb.pack(side = LEFT,fill=BOTH)
sb.config(command=lb.yview)
mainloop()
(解析:首先增加的这个Listbox,lb = Listbox(root,yscrollcommand=sb.set)要给Listbox这个组件加上滚动条,就一定要设置yscrollcommand或者xscrollcommand选项(一个是垂直滚动一个是水平滚动)这两个的值为Scrollbar实例化对象也就是sb的set方法
接着用循环给组件Listbox加内容,加完后pick()出来,刚刚完成了第一个条件,要跟滚动条互通互联,那么这里还需要设置滚动条的一个command选项,sb.config(command=lb.yview),然后可以直接调用对象的config方法来设置他的值,需要注意的是,因为在这个时候,lb才产生,才pick出来,如果在pick()之前设置就会出问题,然后就是设置sb即滚动组件的command选项为Listbox组件的yview方法就好了,
再来分析一下他的过程:这事实上就是一个互联互通的过程,当用户操作滚动条进行滚动的时候,滚动条首先响应用户的滚动操作,接下来,通过 yview() 方法(Listbox 的一个默认方法),事实上就是设置好怎么去显示垂直滚动对应的内容变化,内容会自动刷新,然后,如果是 Listbox 里面滚动(即用鼠标滚轮直接操作),它就会调用 sb.set() 方法,同时修改滚动条的位置。)
##Scale
(Scale和滚动条长得很像,虽然它和滚动条长得像,同样都可以滚,都有滑块,都是条形的,但是它们的应用范围可是不一样的。Scale 组件主要是通过滑块来表示某个范围内的一个数字,你可以通过修改 选项 、设置范围以及分辨率(分辨率就是指的步长)。)
※Scale:Scale(刻度)组件看起来像是一个带数据的 Scrollbar(滚动条)组件,但事实上它们是不同的两个东东。Scale 组件允许用于通过滑动滑块来选择一个范围内的数字。你可以控制该组件的最大值、最小值,以及分辨率。
(当你希望用户输入某个范围内的一个数字的时候,你可能会使用Entry 组件,但是Entry 组件不能限制一个范围,你只能说给出个提示,然后对得到的数字进行检测,这样不方便。你可以直接弄一个 Scale 组件,提供一个范围,然后用户就只能在这个范围内选择。)
先来瞅瞅他吧
from tkinter import *
root = Tk()
Scale(root,from_=0,to=42).pack()
Scale(root,from_=0,to=200,orient = HORIZONTAL).pack()
mainloop()
(分析:Scale有可以设置from和to两个参数,表示范围,因为from是个关键字,为了避免冲突要加个下划线即from_,然后这里是弄出来了两个Scale,Scale默认的是垂直的,我们可以通过设置orient = 'horizontal’为水平的,默认"vertical"是垂直)
我们还可以通过 get()方法来获取这个滑块的当前位置
from tkinter import *
root = Tk()
s1 =Scale(root,from_=0,to=42)
s1.pack()
s2 =Scale(root,from_=0,to=200,orient = HORIZONTAL)
s2.pack()
def show():
print(s1.get())
print(s2.get())
Button(root,text="获取位置",command = show).pack()
mainloop()
我们还可以通过 resolution 选项 来控制它的步长,也就是精度;使用 tickinterval 选项 显示刻度。
from tkinter import *
root = Tk()
Scale(root,from_=0,to=42,tickinterval=5,resolution =5).pack()
Scale(root,from_=0,to=200,tickinterval=10,orient = HORIZONTAL).pack()
mainloop()
(解析:tickinterval=5就是表示显示刻度,这里表示每隔5就显示一个刻度, resolution就是他的精度,可以看到下面那个惨不忍睹,因为下面是0-200,每次间隔10个值的位置,那就会显示一个数字,那么总共要显示20个数字,肯定堆在一起了)
我们还可以通过length选项 设置 Scale 组件的长度(像素)
(解析:通过滑动看出来,上面的设置了resolution =5,即步长是5,点一下就会移动5格,而下面的没有设置这个属性,点一下就会只移动一格)