tkinter:当条目小部件已满而不会丢失击键时,将焦点移至下一个小部件

tkinter: Move focus to next widget when entry widget is full without losing keystroke

这是我在这里的第一个问题,如果我做错了,抱歉。

我正在创建一个条目 class,它将验证输入的长度,然后聚焦下一个小部件。下面的代码执行此操作,但它会在所需长度后触发按键上的焦点更改,这会导致我们丢失该按键

示例:如果您在第一个输入框中输入 123456789,则最终结果在输入框 1 中为 1234,在输入框 2 中为 6789

import tkinter as tk

class ValidateEntry(tk.Frame):

    def __init__(self, parent, width=20, txt=None): 
        tk.Frame.__init__(self, parent)
        self.width = width
        vcmd = (self.register(self.validate), '%i', '%S', '%d', '%P')
        self.entry = tk.Entry(self, width=self.width, validate='key', vcmd=vcmd)
        if txt is not None:
            self.entry.insert('end', txt)
        self.entry.pack()

    def validate(self, i, S, d, P):# i = index, S = insert character, d = action, P = entry value
        if len(P)-1 == self.width and d != 0:
            self.entry.tk_focusNext().focus()
            return False
        return True

root = tk.Tk()
entry1 = ValidateEntry(root, width=4)
entry2 = tk.Entry(root, width=8)
entry1.pack()
entry2.pack()
root.mainloop()

我想不出一种方法来改变焦点并保持上面示例中的第 5 次按键

在第 4 次按键时,您想要接受按键(所以 return 正确)并改变焦点。所以只需将验证函数更改为:

def validate(self, i, S, d, P):# i = index, S = insert character, d = action, P = entry value
    if len(P) == self.width and d != 0:
        self.entry.tk_focusNext().focus()
    return True