我有一个n Entry小部件列表。用户应该只能键入以下字符:“V”,“F”,“”。如果用户键入其中一个字符,则焦点应从条目#x传递到条目#x + 1,否则焦点应保持原位(在条目#x上)并且应丢弃输入。
我无法丢弃错误的输入:如果用户按下与允许的键不同的键,则Entry字段获取该键,但命令.delete(0,END)不起作用,因为小部件本身尚未记住按下的键。
我该怎么办?
答案 0 :(得分:6)
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()
答案 1 :(得分:3)
使用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()
我没有文档参考;我学到了这个here。