我正在尝试使用ttk.widgets库创建一个表单。在使用AutocompleteEntry时,我注意到,如果一次只按一个键,条目就会自动完成,与我按下的前两个键的第一个匹配项(当我释放自己完成的键时),所以当键入fast时会出现这个问题。
import tkinter as tk
from ttkwidgets.autocomplete import AutocompleteEntry
class DfeForm(tk.Tk):
@staticmethod
def only_numbers(char):
return char.isdigit()
def character_limit(self, entry_text):
if len(entry_text.get()) > 0:
entry_text.set(entry_text.get()[:14])
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
padding = {'padx': 5, 'pady': 5}
self.geometry('340x255')
self.title("My form")
validation = self.register(self.only_numbers)
input1_text = tk.StringVar()
input1_label = tk.Label(text='Entry to autocomplete:')
input1_label.grid(row=1, column=0, sticky=tk.E, **padding)
input1_entry = AutocompleteEntry(self, foreground='black', validate='key',
validatecommand=(validation, '%S'), textvariable=input1_text,
completevalues=autocompleteList)
input1_entry.grid(row=1, column=1, **padding, sticky=tk.E)
input1_text.trace("w", lambda *args: self.character_limit(input1_text))
self.resizable(0, 0)
def main():
gui = DfeForm()
gui.mainloop()
autocompleteList = ['123555', '123666', '123777', '223555']
if __name__ == "__main__":
main()在此代码示例中,如果您按“1”,然后按'2‘(在释放'1’键之前),当您释放两个键时,文本将自动自动完成到第一个匹配的“123555”。因此,如果您尝试键入'123666‘快速,该条目将错误自动完成为'123555’。
发布于 2022-10-12 21:42:06
ttkwidgets自动完成是由'<KeyRelease>'而不是'<KeyPress>'完成的。我想这是因为在某些平台上,键压事件会一直被触发,直到发布(例如Windows)。这将导致错误的结果。不过,您可以尝试使用entry.bind('', entry.handle_keyrelease)
您也可以为这个事件实现您自己的验证,并且有需要桥接的时间障碍来插入完全相同的密钥。看起来可能是这样的:
class MyAutocompleteEntry(AutocompleteEntry):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)
self.last_eval = None
self.min_delta = 50
self.bind('<KeyPress>', self.handle_keypress)
self.unbind('<KeyRelease>')
def handle_keypress(self, event):
if self.last_eval:
if self.last_eval[0] == event.keysym:
if event.time-self.last_eval[1] > self.min_delta:
self.handle_keyrelease(event)
else:
return
else:
self.handle_keyrelease(event)
else:
self.handle_keyrelease(event)
self.last_eval = (event.keysym, event.time)https://stackoverflow.com/questions/74047810
复制相似问题