我正在尝试扩展ttk组合框类以允许自动提示。我所使用的代码效果很好,但是我想让它在输入一些文本后显示下拉列表,而不会从小部件的输入部分移除焦点。
我正在努力的部分是找到一种强制下拉的方法,在python文档中我找不到任何提及,但是在tk文档中我确实找到了一个post方法我认为应该这样做,除了它似乎没有在python包装器中实现。
我也尝试在autosuggest发生后生成向下箭头键事件,但是这确实显示了下拉列表它会移除焦点,并且在此事件之后尝试设置焦点似乎也不起作用(焦点不会返回)
有人知道我可以用来实现这个功能吗?
我的代码是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
答案 0 :(得分:0)
您不需要为此事件继承ttk.Combobox;只需使用event_generate强制下拉列表:
box = Combobox(...)
def callback(box):
box.event_generate('<Down>')