2016-04-25 73 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子句,並刪除了上面的註釋行,以便用戶返回並更正一些拼寫錯誤。現在,如果用戶返回並編輯了某些內容,則先前輸入的其他文本將保持不變,如果用戶按下(僅刪除剩餘的自動完成但保留其餘的完整內容)或退格(刪除自動完成和一個字符如預期的那樣)。如果用戶在文本中單擊鼠標,則不會刪除任何內容。