一、给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()