一、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(”, print_item)`表示当列表中的任意一项被释放鼠标时会调用print_item方法。该方法能获取选中项的索引值,并使用`lb.get(i)`获取对应的项内容。在这里我们只是简单地将选中项的内容打印出来了。
这里需要注意的是,获取选中项的索引值实际上是一个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的初始化中绑定了“鼠标右键事件,将事件处理函数设置为popupmenu。这意味着在鼠标右键点击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实现控制,也可以通过定制来更好的呈现选项。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/239547.html
微信扫一扫
支付宝扫一扫