tkinter 自动补全小部件小写偏向

2 投票
1 回答
1448 浏览
提问于 2025-04-17 10:42

我在网上找到一个有趣的自动补全小工具类,经过简化后,用来让我的python 2.7 tkinter输入窗口实现自动补全功能。

from Tkinter import*

class AutocompleteEntry(Entry):

    def set_completion_list(self, completion_list):
        self._completion_list = completion_list
        self._hits = []
        self._hit_index = 0
        self.position = 0
        self.bind('<KeyRelease>', self.handle_keyrelease)               

    def autocomplete(self, delta=0):
        if delta:
            self.delete(self.position,END)
        else:
            self.position = len(self.get())
        _hits = []
        for element in self._completion_list:
            if element.startswith(self.get().lower()):
                _hits.append(element)
                if _hits != self._hits:
                        self._hit_index = 0
                        self._hits=_hits
        if _hits == self._hits and self._hits:
                self._hit_index = (self._hit_index + delta) % len(self._hits)
        if self._hits:
                self.delete(0,END)
                self.insert(0,self._hits[self._hit_index])
                self.select_range(self.position,END)

    def handle_keyrelease(self, event):
        if len(event.keysym)== 1:
            self.autocomplete()

class Code:
    def __init__(self, parent):
        self.myParent = parent
        self.main_frame = Frame(parent, background="light blue")
        self.main_frame.pack(expand=YES, fill=BOTH)

        test_list = ('test', 'type', 'true', 'tree')

        self.enter = AutocompleteEntry(self.main_frame, width=30)
        self.enter.set_completion_list(test_list)
        self.enter.pack(side=LEFT, expand=NO)



root = Tk()
code = Code(root)
root.mainloop() 

这个功能很好用,但有一个让人烦恼的问题:这个自动补全功能似乎只对小写字母的单词有效。这个代码片段可以正常工作:

test_list = ('test', 'type', 'true', 'tree')

如果把列表改成大写字母,自动补全功能就消失了。

test_list = ('Test', 'Type', 'True', 'Tree')

我回去查看了原来的代码,发现它也有同样的问题。请问我该如何修改这个自动补全小工具的代码,以消除这个偏向性,让它能够接受包含大写和小写字母的单词列表呢?

1 个回答

4

试着去掉

.lower()

这个部分

if element.startswith(self.get().lower()):

或者你可以让匹配不区分大小写:

if element.lower().startswith(self.get().lower()):

这样做会把你输入的字符串变成小写,同时也会把列表中的值变成小写,这样无论你输入的字母大小写如何,只要字母相同就能匹配上。

撰写回答