2016-04-25 14 views
0

私はtkinter ttk.Entryウィジェットにオートコンプリートを追加する方法を探していました。私はまた、this solutionを提案したウェブサイトでつまずいた。 RobBの答えを読んで、大文字小文字に関係なく正しく動作させることができました。しかし、私が探しているような使い方(以前のレコードからオートコンプリートを取得しながらSQLiteデータベースに新しい項目を追加する)では、キーを押しても何か変なことがあります。私が試したコードの最初のバージョン(this link、Ian Weisser)は、ユーザーが押すたびに文字を削除します。 StackOverflowのこのバージョンでは、<Backspace>, <Left>, <Right>, <Up>, <Down>のキーストロークをキャッチしたコード行は削除されていましたが、入力中にユーザーがleftを押すと、カーソル位置の後に選択したテキストを削除してオートコンプリートを停止する必要があります。Tkinter「オートコンプリート」エントリーウィジェットに関する問題

したがって、ユーザーがテキストを通常通り入力し、テキストを削除せずにスペルを修正するためにいくつかの文字に戻るようにコードを変更するにはどうすればよいですか?

答えて

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句を追加して、ユーザーが戻ってスペルミスを修正できるように、上記のコメント行を削除しました。ユーザーが戻って何かを編集すると、以前に入力されたテキストの残りの部分は元のままになり、ユーザーが(残っているオートコンプリートのみを削除するが残りはそのまま残す)か、またはバックスペース(オートコンプリートと1文字を削除一度に、期待どおり)。ユーザーがテキストをマウスでクリックすると、何も削除されません。

関連する問題