首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在使用ttk.widgets.autocomplete同时按下两个键时自动完成

避免在使用ttk.widgets.autocomplete同时按下两个键时自动完成
EN

Stack Overflow用户
提问于 2022-10-12 20:40:09
回答 1查看 34关注 0票数 1

我正在尝试使用ttk.widgets库创建一个表单。在使用AutocompleteEntry时,我注意到,如果一次只按一个键,条目就会自动完成,与我按下的前两个键的第一个匹配项(当我释放自己完成的键时),所以当键入fast时会出现这个问题。

代码语言:javascript
复制
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’。

EN

回答 1

Stack Overflow用户

发布于 2022-10-12 21:42:06

ttkwidgets自动完成是由'<KeyRelease>'而不是'<KeyPress>'完成的。我想这是因为在某些平台上,键压事件会一直被触发,直到发布(例如Windows)。这将导致错误的结果。不过,您可以尝试使用entry.bind('', entry.handle_keyrelease)

您也可以为这个事件实现您自己的验证,并且有需要桥接的时间障碍来插入完全相同的密钥。看起来可能是这样的:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74047810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档