2012-01-20 4 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() 

중점을 둔다. 자동 완성 참조가 소문자 단어에 편향된 것으로 보인다.

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

하는 변환합니다 너의 항목 문자열을 소문자로 변환 한 다음 목록 값을 소문자로 변경하여 대소 문자가 꺼져 있어도 동일한 문자가 입력 될 때마다 일치하도록합니다.

관련 문제