簡體   English   中英

使用 ttk.widgets.autocomplete 同時按下兩個鍵時避免自動完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM