您的位置:

Python Listbox访问和控制

一、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实现控制,也可以通过定制来更好的呈现选项。