我创建了一个简单的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
答案 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()