如何在tkinter Entry控件中仅插入指定字符
我有一组 n 个输入框(Entry widgets)。用户只能输入以下字符:“V”、“F”和空格(" ")。如果用户输入了这些字符中的一个,焦点就应该从输入框 #x 移动到输入框 #x+1;如果输入了其他字符,焦点就应该停留在输入框 #x 上,并且这个输入应该被丢弃。
我现在无法丢弃错误的输入:如果用户按下了不允许的键,输入框会接收到这个键,但命令 .delete(0,END) 不起作用,因为输入框本身还没有记住用户按下的键。
我该怎么做呢?
2 个回答
5
通过使用 validate
和 validatecommand
这两个选项,可以创建一个 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()
就可以了。