2016-04-25 11 views
0

Ich habe nach einer Möglichkeit gesucht, Autocompletion zu einem tkinter ttk.Entry Widget hinzuzufügen. Ich stolperte auch mit einer Website, die this solution vorgeschlagen. Als ich die Antwort von RobB las, war ich in der Lage, es unabhängig vom Fall richtig zu machen. Aber für die Art der Verwendung, nach der ich suche (ein neues Element zu einer SQLite-Datenbank hinzufügen, während die Autovervollständigung von früheren Datensätzen erfolgt), gibt es auch etwas Seltsames beim Drücken der Taste. Die erste Version des Codes, den ich ausprobiert habe (von this link, von Ian Weisser), löschte jedesmal ein Zeichen, wenn der Benutzer drückte. Und diese Version auf StackOverflow hatte die Codezeilen entfernt, die die <Backspace>, <Left>, <Right>, <Up>, <Down> Tastatureingaben einfangen, aber ich denke, dass während der Eingabe, wenn der Benutzer nach links drückt, die Autovervollständigung ausgesetzt werden sollte, den ausgewählten Text nach der Cursorposition löschen.Probleme mit Tkinter "Autocomplete" Eintrag Widget

Also, wie können wir den Code ändern, so dass der Benutzer Text normal eingeben und ein paar Zeichen zurückgehen kann, um Rechtschreibfehler zu korrigieren, ohne den Text zu löschen?

Antwort

0

Ich habe den Code bearbeitet, basierend auf diesen zwei Quellen und für mich, ich denke, das funktioniert besser:

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

Im Grunde ist es Version Ian Weisser. Ich fügte eine if Klausel zu dem "Rückschritt" Schlüsselteil hinzu und ich entfernte die oben genannten kommentierten Zeilen, um dem Benutzer zu erlauben, zurückzugehen und einige Rechtschreibfehler zu korrigieren. Wenn der Benutzer nun zurückgeht und etwas bearbeitet, bleibt der Rest des zuvor eingegebenen Textes intakt und der Text wird nur gelöscht, wenn der Benutzer drückt (löscht nur die restliche Autovervollständigung, aber den Rest intakt lässt) oder zurück (löscht Autovervollständigung und ein Zeichen) zu einer Zeit, wie erwartet). Wenn der Benutzer im Text mit der Maus klickt, wird nichts gelöscht.

Verwandte Themen