您的位置:

Python Tkinter Listbox使用指南

一、给Listbox赋值

在Tkinter中,使用Listbox展示数据非常简单,我们可以通过Listbox类创建一个可以显示列表项的控件。

from tkinter import *
root = Tk()
listbox = Listbox(root,width=50)
for item in ['apple','banana','watermelon']:
    listbox.insert(END,item)
listbox.pack()
root.mainloop()

首先创建一个可以容纳Listbox的窗口对象,然后通过Listbox类创建一个Listbox控件;接着,通过循环遍历一组数据,将数据插入到Listbox框中,最后调用pack方法将框中的数据显示,这个时候,一个简单的列表就创建完成了。

二、交互功能:选择、删除列表项

当展示数据已经不再是我们的目标,我们还需要与这些数据进行交互操作,比如选择、删除等等。在Tkinter中,我们可以轻松的完成这些操作。

要选择列表中的一项,只需要在创建时设置好该控件的selectmode选项即可。该属性有四个参数:

  • SINGLE:表示只能选中一个选项。
  • BROWSE:和SINGLE一样,都只能选中一个选项,但是通过鼠标拖动某个选项时,可以更改选中的项。
  • MULTIPLE:表示可以选中多个选项,但是不能用鼠标拖动来多选。
  • EXTENDED:表示可以多选,而且可以用鼠标拖动来选中多个选项。

对于删除,可以定义一个函数来实现。在该函数内部,我们先获取选择的项,然后删除。

def delete_item(self):
    try:
        current_item = self.listbox.curselection()
        self.listbox.delete(current_item)
    except EXCEPTION as e:
        pass

在上述代码中,使用curselection()方法获取当前选择的项,如果有选择的项,则调用delete()方法删除该项,并在异常处理时忽略之。

三、交互功能:更新列表项

修改列表项和删除列表项实现起来相差不大,在此就不赘述,相比之下,更新列表项可能让人有些头疼。但我们可以使用curselection()方法在列表中查找到相应的位置,调用insert()方法插入即可。

def update_item(self):
    try:
        current_item = self.listbox.curselection()
        self.listbox.insert(current_item, self.entry.get())
        self.listbox.delete(current_item)
    except EXCEPTION as e:
        pass

以上代码中,使用curselection()方法获取当前选择的项,接着通过insert()方法在该选项之前插入一个新的元素,并调用delete()方法删除原来的选择。

四、完整例子

以下是一个完整的例子,来完整地展示Listbox的可交互功能,包括选择、删除和更新功能:

from tkinter import *

class ListBoxDemo():
    def __init__(self):
        self.root = Tk()
        self.listbox = Listbox(self.root, selectmode=SINGLE)
        self.listbox.bind("",self.update_item) 
        self.listbox.pack(padx=10,pady=10)
        self.items = ['apple','banana','watermelon']
        self.insert_items_to_listbox()
        self.create_button()
        self.create_entry()
        self.root.mainloop()

    def insert_items_to_listbox(self):
        for item in self.items:
            self.listbox.insert(END,item)

    def create_button(self):
        entry_frame = Frame(self.root)
        delete_button = Button(entry_frame,text='Delete',command=self.delete_item)
        delete_button.pack(side=LEFT,padx=10)
        update_button = Button(entry_frame,text='Update',command=self.update_item)
        update_button.pack(side=LEFT)
        entry_frame.pack(side=TOP)

    def create_entry(self):
        self.entry = Entry(self.root,width=50)
        self.entry.pack(pady=10)

    def delete_item(self):
        try:
            current_item = self.listbox.curselection()
            self.listbox.delete(current_item)
        except EXCEPTION as e:
            pass

    def update_item(self,event):
        try:
            current_item = self.listbox.curselection()
            item_text = self.listbox.get(current_item)
            self.entry.insert(END,item_text)
            self.listbox.delete(current_item)
        except EXCEPTION as e:
            pass

app=ListBoxDemo()