Я пытаюсь расширить класс combobox ttk, чтобы разрешить самовнушение. код, который у меня есть, работает хорошо, но я хотел бы, чтобы он отображал раскрывающийся список после ввода некоторого текста, не удаляя фокус из вводной части виджета.
Часть, с которой я борюсь, - это найти способ заставить выпадающий список, в документах python я не могу найти упоминания об этом, однако в документах tk я нашел метод post, который, как мне кажется, должен это делать, за исключением того, что он не похоже, он реализован в оболочке python.
Я также попытался сгенерировать событие клавиши со стрелкой вниз после того, как автозаполнение произошло, однако, хотя это действительно показывает раскрывающийся список, он удаляет фокус, и попытка установить фокус после этого события, похоже, тоже не работает (фокус не возвращается)
Кто-нибудь знает о функции, которую я могу использовать для достижения этой цели?
У меня есть код для python 3.3, использующий только стандартные библиотеки:
class AutoCombobox(ttk.Combobox):
def __init__(self, parent, **options):
ttk.Combobox.__init__(self, parent, **options)
self.bind("<KeyRelease>", self.AutoComplete_1)
self.bind("<<ComboboxSelected>>", self.Cancel_Autocomplete)
self.bind("<Return>", self.Cancel_Autocomplete)
self.autoid = None
def Cancel_Autocomplete(self, event=None):
self.after_cancel(self.autoid)
def AutoComplete_1(self, event):
if self.autoid != None:
self.after_cancel(self.autoid)
if event.keysym in ["BackSpace", "Delete", "Return"]:
return
self.autoid = self.after(200, self.AutoComplete_2)
def AutoComplete_2(self):
data = self.get()
if data != "":
for entry in self["values"]:
match = True
try:
for index in range(0, len(data)):
if data[index] != entry[index]:
match = False
break
except IndexError:
match = False
if match == True:
self.set(entry)
self.selection_range(len(data), "end")
self.event_generate("<Down>",when="tail")
self.focus_set()
break
self.autoid = None
self.tk.call('ttk::combobox::Post', self)- person falsetru   schedule 31.08.2014