如何为我的应用程序实现自动搜索功能?

时间:2017-04-18 12:25:46

标签: python tkinter

我创建了一个简单的GUI应用程序来管理未知单词,同时学习一门新语言。名为Vocabulary的应用程序是用C#编写的,它从XML文档中加载/保存单词。由于我最近从Windows切换到Linux,我正在使用Python重写应用程序。

然而,我在为我的应用程序实现搜索功能时遇到了麻烦。当我在文本小部件中输入单词时,它应自动显示在列表框中。为了完成我想要的应用程序,我知道我应该处理文本小部件的文本更改事件。

这是我最初的C#方法:

private void txt_Search_TextChanged(object sender, EventArgs e)
{
    if (txt_Search.Text != "")
    {
        for (int i = listView1.Items.Count - 1; i >= 0; i--)
        {
            var item = listView1.Items[i];
            if (item.Text.ToLower().Contains(txt_Search.Text.ToLower()))
            {
                item.BackColor = SystemColors.Highlight;
                item.ForeColor = SystemColors.HighlightText;
            }
            else
            {
                listView1.Items.Remove(item);
            }
        }
        if (listView1.SelectedItems.Count == 1)
        {
            listView1.Focus();
        }
    }
    else
    {
        LoadWords();
        RefreshAll();
        foreach (ListViewItem item in listView1.Items)
        {
            item.BackColor = SystemColors.Window;
            item.ForeColor = SystemColors.WindowText;
        }
    }
}

...到目前为止,这是我的Python函数:

def txt_Search_text_changed(self, event = None):

    if self.get_search() != None:

        i = self.listBox.size() - 1

        for x in range(i, 0, -1):
            item = self.listBox.get(0, "end")[i]
            if self.get_search().lower() in item.lower():
                self.listBox.itemconfig(i, {'bg': 'red'})

            else:
                self.listBox.delete(item)

        if len(self.listBox.curselection()) == 1:
            self.listBox.focus()

    else:
        self.load_words()
        self.refresh_all()
        for item in self.listBox.get(0, "end"):
            self.listBox.itemconfig(i, {'bg': 'white'})

我不知道Python的等价物是什么:

listView1.Items[i]; listView1.Items

1 个答案:

答案 0 :(得分:0)

您可以使用listBox.get(0, "end")轻松获取列表框中的所有项目。使用该列表,您可以使用普通的python方法进行搜索。

这是一个使用变量跟踪在值发生变化时进行搜索的示例:

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.search_var = tk.StringVar()
        self.entry = tk.Entry(self, textvariable=self.search_var)
        self.listbox = tk.Listbox(self)
        self.entry.pack(side="top", fill="x")
        self.listbox.pack(side="left",fill="both", expand=True)

        self.search_var.trace("w", self.autosearch)

        self.listbox.insert("end", "four", "fourteen", "fourty-four", "four hundred")

    def autosearch(self, *args):
        search_string = self.entry.get().lower()
        values = [item.lower() for item in self.listbox.get(0, "end")]

        for index in range(len(values)):
            # reset background to the default
            self.listbox.itemconfigure(index, background="")

        if len(search_string) > 0:
            for index, item in enumerate(values):
                if search_string in item:
                    self.listbox.itemconfigure(index, background="pink")

root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()