2012-01-20 3 views
2

インターネット上で楽しいオートコンプリートウィジェットクラスが見つかりました。これは私の退屈なpython 2.7のtkinterエントリウィンドウを自動補完するための必須事項です。tkinterオートコンプリートウィジェットの小文字のバイアス

from Tkinter import* 

class AutocompleteEntry(Entry): 

    def set_completion_list(self, completion_list): 
     self._completion_list = completion_list 
     self._hits = [] 
     self._hit_index = 0 
     self.position = 0 
     self.bind('<KeyRelease>', self.handle_keyrelease)    

    def autocomplete(self, delta=0): 
     if delta: 
      self.delete(self.position,END) 
     else: 
      self.position = len(self.get()) 
     _hits = [] 
     for element in self._completion_list: 
      if element.startswith(self.get().lower()): 
       _hits.append(element) 
       if _hits != self._hits: 
         self._hit_index = 0 
         self._hits=_hits 
     if _hits == self._hits and self._hits: 
       self._hit_index = (self._hit_index + delta) % len(self._hits) 
     if self._hits: 
       self.delete(0,END) 
       self.insert(0,self._hits[self._hit_index]) 
       self.select_range(self.position,END) 

    def handle_keyrelease(self, event): 
     if len(event.keysym)== 1: 
      self.autocomplete() 

class Code: 
    def __init__(self, parent): 
     self.myParent = parent 
     self.main_frame = Frame(parent, background="light blue") 
     self.main_frame.pack(expand=YES, fill=BOTH) 

     test_list = ('test', 'type', 'true', 'tree') 

     self.enter = AutocompleteEntry(self.main_frame, width=30) 
     self.enter.set_completion_list(test_list) 
     self.enter.pack(side=LEFT, expand=NO) 



root = Tk() 
code = Code(root) 
root.mainloop() 

素晴らしい1つの煩わしい警告が表示されます。オートコンプリートが参照するリストは小文字に偏っているようです。

test_list = ('test', 'type', 'true', 'tree') 

変更リストを大文字にし、オートコンプリート機能が消滅:このコードは動作します。

test_list = ('Test', 'Type', 'True', 'Tree') 

私は、元のインターネットコードhttp://tkinter.unpythonic.net/wiki/AutocompleteEntryに行ってきた、それは同じ欠陥を示しています。このバイアスを排除するためにオートコンプリートウィジェットコードを変更すると、大文字と小文字の単語を含むリストを受け入れることができますか?

答えて

3

一致が大文字と小文字を区別するために

if element.startswith(self.get().lower()): 

又はから

.lower()

を削除してください:

if element.lower().startswith(self.get().lower()): 

が変換されきみの エントリ文字列を小文字に変換し、リスト値を小文字に変換して、大文字小文字の区別がなくても同じ文字が入力されるといつでも一致させることができます。