Tkinter“自动填充”条目小部件的问题

时间:2016-04-25 02:55:13

标签: python tkinter autocomplete

我一直在寻找一种方法来为tkinter ttk.Entry小部件添加自动完成功能。我还偶然发现了一个建议this solution的网站。阅读RobB的回答,无论如何,我能够使其正常工作。但是对于我正在寻找的那种用法(在从以前的记录中获取自动完成时向SQLite数据库添加新项目),按键也有一些奇怪的地方。我尝试的代码的第一个版本(来自this link,由Ian Weisser提供)将在每次用户按下时删除一个字符。而StackOverflow上的这个版本剥离了捕获<Backspace>, <Left>, <Right>, <Up>, <Down>键击的代码行,但我认为在键入时,如果用户按下左键,则应暂停自动完成,删除光标位置后的所选文本。

那么,我们如何更改代码以便用户可以正常输入文本并返回几个字符来纠正任何拼写错误,而不删除文本?

1 个答案:

答案 0 :(得分:0)

我根据这两个来源编辑了代码,对我来说,我觉得这样做效果更好:

    def handle_keyrelease(self, event):
    """event handler for the keyrelease event on this widget"""
    if event.keysym == "BackSpace":
        if self.position < self.index(END): # delete the selection
            self.delete(self.position, END)
        else:
            #self.delete(self.index(INSERT), END) 
            self.position = self.index(END)
    if event.keysym == "Left":
        if self.position < self.index(END): # delete the selection
            self.delete(self.position, END)
        #else:
            #self.position = self.position-1 # delete one character
            #self.delete(self.position, END)
    if event.keysym == "Right":
        self.position = self.index(END) # go to end (no selection)
    if event.keysym == "Down":
        self.autocomplete(1) # cycle to next hit
    if event.keysym == "Up":
        self.autocomplete(-1) # cycle to previous hit
    # perform normal autocomplete if event is a single key or an umlaut
    if len(event.keysym) == 1:
        self.autocomplete()

基本上,它是Ian Weisser的版本。我在“退格”键部分添加了一个if子句,我删除了上面注释的行,以便允许用户返回并更正一些拼写错误。现在,如果用户返回并编辑某些内容,则先前输入的文本的其余部分将保持不变,如果用户按下(仅删除剩余的自动完成但保留其余部分)或退格(删除自动完成和一个字符),则仅删除文本正如预期的那样)。如果用户在文本中单击鼠标,则不会删除任何内容。