[英]Avoid autocompleting when two keys are pressed at once with ttk.widgets.autocomplete
我正在嘗試使用 ttk.widgets 庫創建一個表單。 使用 AutocompleteEntry 時,我注意到如果我一次不只按一個鍵,則條目會自動完成我按下的前兩個鍵的第一個匹配項(當我釋放鍵時它會自行自動完成),因此在鍵入時快出現這個問題。
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”。
ttkwidgets 自動完成由'<KeyRelease>'
而不是'<KeyPress>'
完成。 我想這樣做的目的是因為在某些平台上,按鍵事件會持續觸發直到發布(例如 Windows)。 這會導致錯誤的結果。 但是你可以嘗試entry.bind('<KeyPress>', 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.