该示例是一个简单的滚动列表框演示,用到两个组件,Listbox(列表框)和Scrollbar(滚动条)。最终效果是实现一个列表展示界面,界面包括水平和垂直滚动条,内容比较简单。效果如下:


效果图

全部代码如下:

from tkinter import *
class ScrolledList(Frame):
def __init__(self,options,parent=None):
Frame.__init__(self,parent)
self.pack(expand=YES,fill=BOTH)
self.makeWidgets(options)
def handleList(self,options):
index=self.listbox.curselection() # 得到列表框中被选中项的索引值
label=self.listbox.get(index) # 按照索引来提取被选中项的内容
self.runCommand(label)
def makeWidgets(self,options):
ysbar=Scrollbar(self)
xsbar=Scrollbar(self)
list=Listbox(self,relief=SUNKEN,bg='white',font=('courier',12))
ysbar.config(command=list.yview) # list.yview是一个内置的列表框方法,可以按照比例调节列表框的显示
xsbar.config(command=list.xview,orient='horizontal') # 水平滚动条需要设置orient选项,否则默认是垂直显示(上下调节,而非我们习惯的左右调节)
list.config(yscrollcommand=ysbar.set) # sbar.set也是个内置滚动条函数,它会按比例调节滚动条,跟ysbar.config语句一起用会自动将两个组件相互同步(移动两者任何一个,另一个会随之移动)
list.config(xscrollcommand=xsbar.set,relief=SUNKEN)
ysbar.pack(side=RIGHT,fill=Y)
xsbar.pack(side=BOTTOM,fill=X)
list.pack(side=LEFT,expand=YES,fill=BOTH)
pos=0
for label in options:
list.insert(pos,label) # pos是label的索引,从0开始,可以用END或者active分别代表末尾和被选中的列表项
pos+=1
list.config(selectmode=BROWSE,setgrid=1)
list.bind('',self.handleList)
self.listbox=list
def runCommand(self,selection):
print('You selected:',selection)


水平缩小界面if __name__=="__main__":
options=(('Longlonglist-%s'%x) for x in range(50)) # 为了显示出水平滚动条的效果,让显示内容加长一点
ScrolledList(options).mainloop()


双击列表项

注:列表框不具备类似按钮一样的command选项来设置回调函数。

列表框的selectmode选项支持四种模式,SINGLE,BROWSE,MULTIPLE和EXTENDED,默认是BROWSE,前两种是单选模式,后两种允许选择多个条目。BROWSE类似SINGLE,但允许拖拉选项。MULTIPLE模式下,单击一个条目会触发其状态而不影响其它选中条目。EXTENDED模式允许多选,方式类似Windows文件浏览器的GUI,单击可以选中一个条目,按下Ctrl键可以选中多个条目,按下Shift键则可选中范围内的多个条目。

tkinter中每一个可滚动的对象如Listbox,Entry,Text和Canvas都可以通过内置的yview和xview方法来实现垂直或者水平滚动条的效果。yscrollcommand和xscrollcommand选项则用于激活相关滚动条的回调函数。二者同时使用可以实现滚动条和列表框同步的效果(即拖动滚动条,列表框会跟着动,反之亦然)。

由于在缩小窗口时,最后部署的组件会最先被挤掉,而滚动条对于导航和浏览列表内容是不可或缺的,因此,需要先部署滚动条后部署列表框。这样,当窗口缩小无法全部容纳时,滚动条将最后消失。我们一般并不希望滚动条随着窗口扩大而扩大,因此滚动条一般设置fill=Y或者fill=X,只达到垂直或者水平扩展的目的,而不会设置为fill=BOTH。