一、Listbox控制的基本操作
Python的Tkinter模块提供了Listbox控件,Listbox是一种用于显示一组选项的控件。相对于其他控件比如Radiobutton和Checkbutton,Listbox能同时显示多个选项。
下面的代码实现了在一个Listbox中添加、查询、选中和删除项的基本操作:
from tkinter import * def print_item(event): selection = lb.curselection() print(selection) for i in selection: print(lb.get(i)) root = Tk() var = StringVar() lb = Listbox(root, listvariable=var) list_item = [1,2,3,4] for item in list_item: lb.insert(END, item) lb.bind('', print_item) lb.pack() root.mainloop()
首先,我们创建了一个名为`root`的窗口,然后在该窗口中创建一个Listbox。`listvariable=var`表示将var变量与Listbox绑定,方便以后在代码中对Listbox进行操作。
我们接着定义了一个包含四个元素的`list_item`列表,循环遍历该列表将其元素添加到Listbox中。
`lb.bind('
这里需要注意的是,获取选中项的索引值实际上是一个Tuple类型。因此需要使用for循环逐个获取其内部的元素。
另外,如果我们需要添加新项到Listbox中,可以使用`lb.insert(END, 'new item')`方法,'new item'是新项的内容,END表示在Listbox的末尾添加新项。
如果需要将指定的项删除,可以使用`lb.delete(first, last=None)`方法。其中first和last分别表示要删除的起始项和终止项,如果省略last则只删除第一项。
二、给Listbox添加滚动条
如果我们的选项很多,就需要给Listbox添加滚动条以方便用户选择。
from tkinter import * def print_item(event): selection = lb.curselection() for i in selection: print(lb.get(i)) root = Tk() var = StringVar() # 添加垂直和水平滚动条 sb = Scrollbar(root) sb.pack(side=RIGHT, fill=Y) sb2 = Scrollbar(root, orient=HORIZONTAL) sb2.pack(side=BOTTOM, fill=X) lb = Listbox(root, listvariable=var, yscrollcommand=sb.set, xscrollcommand=sb2.set) list_item = [i for i in range(100)] for item in list_item: lb.insert(END, item) lb.bind('', print_item) lb.pack(side=LEFT, fill=BOTH) sb.config(command=lb.yview) sb2.config(command=lb.xview) root.mainloop()
我们需要先创建一个Scrollbar对象,然后通过pack或grid方法添加到窗口中。然后在Listbox的初始化中,使用yscrollcommand和xscrollcommand参数将Scrollbar对象与Listbox绑定起来,以便响应滚动条的事件。最后使用config方法为Scrollbar对象设置响应的view方法以实现滚动条的响应。
三、给Listbox添加右键菜单
有时候,我们希望在点击Listbox中某个选项时弹出一个右键菜单,以实现更多的操作。
from tkinter import * def print_item(event): selection = lb.curselection() for i in selection: print(lb.get(i)) # 创建菜单 def popupmenu(event): menu.post(event.x_root, event.y_root) root = Tk() var = StringVar() lb = Listbox(root, listvariable=var) list_item = [i for i in range(100)] for item in list_item: lb.insert(END, item) lb.bind('', print_item) menu = Menu(root, tearoff=0) menu.add_command(label='删除', command=lambda lb=lb: lb.delete(ACTIVE)) lb.bind(' ', popupmenu) # 绑定鼠标右键事件 lb.pack() root.mainloop()
这里我们创建了一个名为menu的Menu对象,tearoff参数设置为0表示菜单不能被拆分。我们添加了‘删除’菜单项,并将其命令设置为lambda表达式,在删除选项后更新Listbox。
然后我们在Listbox的初始化中绑定了`
四、给Listbox的选项添加颜色和图标
Listbox的默认呈现方式并不总是很美观,我们经常需要对其进行一些定制。比如,我们可以给选项添加背景颜色和图标。
from tkinter import * from tkinter import ttk def print_item(event): selection = lb.curselection() for i in selection: print(lb.get(i)) root = Tk() var = StringVar() lb = Listbox(root, listvariable=var) list_item = [('香蕉', 'fruit/banana.png'), ('苹果', 'fruit/apple.png'), ('樱桃', 'fruit/cherry.png'), ('猕猴桃', 'fruit/kiwi.png')] for item in list_item: f = Frame() f.pack(fill=BOTH, expand=YES) icon = PhotoImage(file=item[1]) label = Label(f, text=item[0], image=icon, compound='right') label.pack(side=LEFT, fill=BOTH, expand=YES) lb.insert(END, f) lb.bind('', print_item) lb.pack() root.mainloop()
在这里,我们首先定义了一个包含二元组的列表`list_item`,其中每个二元组有一个字符串元素和一个图片路径元素。我们遍历该列表,并创建一个Frame,将图标和标签添加到其中。
`PhotoImage(file=item[1])`表示根据图片路径创建一个PhotoImage对象。 `Label(f, text=item[0], image=icon, compound='right')`中的compound参数表示图标在标签中的位置,这里设置为右侧。
我们将每个Frame插入到Listbox中,而不是将字符串元素直接插入。这样可以保留图标。
总结
Listbox是一个非常实用的控件,我们可以在其中显示多个选项,使用Scroll和Menu实现控制,也可以通过定制来更好的呈现选项。