【发布时间】:2010-08-13 16:31:41
【问题描述】:
我有一个包含 n 个 Entry 小部件的列表。用户应该只能键入以下字符:“V”、“F”、“”。如果用户键入其中一个字符,则焦点应从条目 #x 传递到条目 #x+1,否则焦点应保持在原位置(在条目 #x 上)并且应丢弃输入。
我无法丢弃错误的输入:如果用户按下的键与允许的键不同,Entry 字段会获取该键,但命令 .delete(0,END) 不起作用,因为小部件本身还没有记住按下的键。
我该怎么办?
【问题讨论】:
我有一个包含 n 个 Entry 小部件的列表。用户应该只能键入以下字符:“V”、“F”、“”。如果用户键入其中一个字符,则焦点应从条目 #x 传递到条目 #x+1,否则焦点应保持在原位置(在条目 #x 上)并且应丢弃输入。
我无法丢弃错误的输入:如果用户按下的键与允许的键不同,Entry 字段会获取该键,但命令 .delete(0,END) 不起作用,因为小部件本身还没有记住按下的键。
我该怎么办?
【问题讨论】:
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()
【讨论】:
return 'break' 是您阻止 Tkinter 事件传播的方式(即按下按钮等)。
使用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。
【讨论】: