Python GUI开发之Tkinter基础篇5:Listbox、Scrollbar组件
一、前言
上一节我们学习了Radiobutton、Checkbutton组件,适用于少量的需要展示在列表中的选项,如果选项非常多,就推荐使用Listbox组件,不仅美观,且不会出现因按钮过多导致用户界面不够存放的情况。本文向大家介绍Listbox、Scrollbar组件,先用Listbox创建一个列表选项,再用Scrollbar为Listbox安装一个垂直滚动条。
二、Listbox使用实例
1、先创建一个空列表:
from tkinter import *
root = Tk()
root.title("你最喜欢的城市?")
root.geometry("255x255")
lb = Listbox(root)
lb.pack()
2、往列表中添加选项
for item in ["北京","上海","广州","深圳","长沙","武汉","郑州","重庆","成都","西安","杭州","南京","宁波","无锡"]:
lb.insert(END,item)
3、设置一个删除按钮,按下即可删除选中的城市
thebutton = Button(root,text = "删除",command = lambda x=lb:x.delete(ACTIVE))
thebutton.pack()
- ACTIVE表示当前选中项。
4、将Listbox绑定一个事件,用以获取选中选项,并设置一个Label将该选项显示出来
var=StringVar()
var.set("你喜欢的城市在这!")
label=Label(root,textvariable=var).pack()
def search(event):
var.set(lb.get(lb.curselection()))
lb.bind('<ButtonRelease-1>',search)
lb.pack()
ButtonRelease为鼠标按键释放后触发,在List中鼠标选中选项,松手后触发该事件。
5、完整代码
from tkinter import *
root = Tk()
root.title("你最喜欢的城市?")
root.geometry("255x255")
lb = Listbox(root)
lb.pack()
for item in ["北京","上海","广州","深圳","长沙","武汉","郑州","重庆","成都","西安","杭州","南京","宁波","无锡"]:
lb.insert(END,item)
thebutton = Button(root,text = "删除",command = lambda x=lb:x.delete(ACTIVE))
thebutton.pack()
var=StringVar()
var.set("你喜欢的城市在这!")
label=Label(root,textvariable=var).pack()
def search(event):
var.set(lb.get(lb.curselection()))
lb.bind('<ButtonRelease-1>',search)
lb.pack()
mainloop()
6、运行
有小伙伴可能注意到了,列表中“西安”以后的城市没有显示出来,我们通过鼠标按住往下拉,或者鼠标滚动,也是可以显示出来的,但这样不够美观,也容易被用户忽略。那有没有办法解决这个问题呢?
答案是有的,两个方法:
1、为Listbox修改高度height选项。
2、为Listbox添加垂直滚动条。
我们来试试修改高度为14.
lb = Listbox(root,height = 14)
结果如下:
修改height选项虽然可以解决问题,但如果列表中选项足够多,例如超过50个,用这种办法就会导致界面很不美观。这时我们就需要添加滚动条,下面向大家介绍滚动条Scrollbar组件的用法。
三、Scrollbar使用实例
虽然滚动条是作为一个独立的组件存在,但它几乎都是与其他组件配合使用的,下面来演示如何向Listbox添加垂直滚动条。
在Listbox添加垂直滚动条,需要做两步:
1、设置Listbox组件的yscrollcommand选项为Scrollbar组件的set()方法。
2、设置Scrollbar组件的command选项为Listbox组件的yview()方法。
代码如下:
from tkinter import *
root = Tk()
root.title("你最喜欢的城市?")
root.geometry("255x255")
scrollbar = Scrollbar(root)
scrollbar.pack(side = RIGHT,fill = Y)
lb = Listbox(root,yscrollcommand = scrollbar.set)
lb.pack()
for item in ["北京","上海","广州","深圳","长沙","武汉","郑州","重庆","成都","西安","杭州","南京","宁波","无锡","昆明","青岛","海南","天津","厦门","兰州","合肥","南昌","徐州"]:
lb.insert(END,item)
thebutton = Button(root,text = "删除",command = lambda x=lb:x.delete(ACTIVE))
thebutton.pack()
var = StringVar()
var.set("你喜欢的城市在这!")
Label(root,textvariable=var).pack()
def search(event):
var.set(lb.get(lb.curselection()))
lb.bind('<ButtonRelease-1>',search)
scrollbar.config(command = lb.yview)
mainloop()
注意:在本示例中,Listbox中的scrollbar.set和scrollbar中的lb.yview后面都是没有括号的,不要写错了。
分析:事实上这是一个互联互通的过程,当用户操作滚动条时,滚动条响应滚动并同时通过Listbox组件的yview()方法滚动列表框里的内容;同样的,当列表框中可视范围发生改变的时候,Listbox组件通过调用Scrollbar组件的set()方法设置滚动条的最新位置。
运行
滑动滚动条后,选中"杭州",显示如下:
四、结语
如您在使用过程中有任何问题,请加QQ群进一步交流。
QQ交流群:906015840 (备注:物联网项目交流)。
获取资料:微信扫描下方二维码,关注公众号:一个物联网项目的前世今生,回复tkinter即可。
静晨出品:静之所想,晨之所计
上一篇: Tkinter的Toplevel组件
下一篇: 【字符串中提取连续数字放在整型数组中】