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

2024-09-29 23:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在创建一个entry类,它将验证输入的长度,然后关注下一个小部件。下面的代码可以做到这一点,但它会在所需长度后触发按键上的焦点更改,这会导致我们丢失该按键

示例:如果在第一个输入框中键入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()

在上面的例子中,我想不出一个方法来改变焦点并保持第五次按键


Tags: selftxtdefrootwidthvalidateframepack
1条回答
网友
1楼 · 发布于 2024-09-29 23:31:31

在第四次按键时,您希望接受该键(因此返回true)并更改焦点。因此,只需将validate函数更改为:

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

相关问题 更多 >

    热门问题