如何在tkinter Entry控件中仅插入指定字符

2 投票
2 回答
7631 浏览
提问于 2025-04-16 02:45

我有一组 n 个输入框(Entry widgets)。用户只能输入以下字符:“V”、“F”和空格(" ")。如果用户输入了这些字符中的一个,焦点就应该从输入框 #x 移动到输入框 #x+1;如果输入了其他字符,焦点就应该停留在输入框 #x 上,并且这个输入应该被丢弃。

我现在无法丢弃错误的输入:如果用户按下了不允许的键,输入框会接收到这个键,但命令 .delete(0,END) 不起作用,因为输入框本身还没有记住用户按下的键。

我该怎么做呢?

2 个回答

5

通过使用 validatevalidatecommand 这两个选项,可以创建一个 tk.Entry 输入框,这个输入框只接受字符 'VF ',而且还能告诉你按下了哪个键,以及当前输入框里的值是什么:

import Tkinter as tk

def validate(char, entry_value):
    if char in 'VF ':
        print('entry value: {P}'.format(P = entry_value))
        return True
    else:
        print('invalid: {s}'.format(s = char))
        return False

root = tk.Tk()
vcmd = (root.register(validate), '%S', '%P')
entry = tk.Entry(root, validate = 'key', validatecommand = vcmd)
entry.pack()
entry.focus()

root.mainloop()

我没有找到相关的文档参考;我是从 这里 学到的。

7
import Tkinter as tk

def keyPress(event):
    if event.char in ('V', 'F', ' '):
        print event.char
    elif event.keysym not in ('Alt_r', 'Alt_L', 'F4'):
        print event.keysym
        return 'break'


root = tk.Tk()
entry = tk.Entry()
entry.bind('<KeyPress>', keyPress)
entry.pack()
entry.focus()

root.mainloop()

你可以很简单地把这个语句拆开,这样它就可以根据按键的不同而采取不同的形式。

这里的 event.keysym 是为了让你在这个小部件里可以用 ALT-F4 来关闭应用。如果你只写 else: return 'break',那么它会捕捉到所有其他的按键输入。

另外,这个捕捉是区分大小写的。如果你想不区分大小写,只需要把它改成 event.char.upper() 就可以了。

撰写回答