2016-04-25 69 views
0

我一直在寻找一种方法来添加自动完成到tkinter ttk.Entry部件。我也偶然发现一个网站,建议this solution。阅读RobB的答案,无论大小写如何,我都能够正常工作。但对于我正在寻找的这种用法(在从以前的记录中获得自动填充的同时向SQLite数据库添加新项目),按按键也有些不可思议。我试过的第一个版本的代码(来自Ian Weisser的this link)会在用户每次按下时删除一个字符。 StackOverflow上的这个版本已经剥离了获得<Backspace>, <Left>, <Right>, <Up>, <Down>击键的代码行,但我认为在输入时,如果用户按下左侧,应该暂停自动完成,在光标位置后删除所选文本。Tkinter“自动完成”问题Entry Widget

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

回答

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() 

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