【发布时间】:2018-05-14 08:19:18
【问题描述】:
我正在尝试做一个动态搜索功能,用户还可以在列表中选择多个项目。如果我们考虑这个example(我添加了这部分,selectmode=MULTIPLE):
from Tkinter import *
# First create application class
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.create_widgets()
# Create main GUI window
def create_widgets(self):
self.search_var = StringVar()
self.search_var.trace("w", self.update_list)
self.entry = Entry(self, textvariable=self.search_var, width=13)
self.lbox = Listbox(self,selectmode=MULTIPLE, width=45, height=15)
self.entry.grid(row=0, column=0, padx=10, pady=3)
self.lbox.grid(row=1, column=0, padx=10, pady=3)
self.btn = ttk.Button(self, text="Select", command=self.Select)
self.btn.grid(column=1, row=1)
# Function for updating the list/doing the search.
# It needs to be called here to populate the listbox.
self.update_list()
def update_list(self, *args):
search_term = self.search_var.get()
# Just a generic list to populate the listbox
lbox_list = ['Adam', 'Lucy', 'Barry', 'Bob',
'James', 'Frank', 'Susan', 'Amanda', 'Christie']
self.lbox.delete(0, END)
for item in lbox_list:
if search_term.lower() in item.lower():
self.lbox.insert(END, item)
def Select(self):
reslist = list()
selecion = self.lbox.curselection()
for i in selecion:
entered = self.lbox.get(i)
reslist.append(entered)
print reslist
root = Tk()
root.title('Filter Listbox Test')
app = Application(master=root)
print 'Starting mainloop()'
app.mainloop()
搜索功能工作得非常好,但是,一旦完成搜索并选择了一个项目,则不会保存选择,因为lbox.delete 函数在update_list 中使用。有没有办法在使用搜索功能时保持选中每个项目?
【问题讨论】:
-
我会看到this。
-
感谢您的链接,但是,如果我不使用搜索栏,我了解如何绑定选择。但是,我想搜索 Adam,选择该项目,然后搜索 Lucy,然后调用所选项目(Adam 和 Lucy)。但是,由于列表是动态更新的,并且项目已从列表中删除,因此这是行不通的。
-
您必须将所选元素保留在列表中,并使用此列表过滤搜索结果。
-
或者你应该创建一个函数,让你使用
"OR"-"Adam OR Lucy"或"Adam | Lucy"或简单的"Adam Lucy"进行搜索。您可以使用正则表达式进行搜索。 -
我会在选择后将它们附加到一个属性中。