如何在tkinter Entry小部件中仅插入一些指定的字符

时间:2010-08-13 16:31:41

标签: python tkinter

我有一个n Entry小部件列表。用户应该只能键入以下字符:“V”,“F”,“”。如果用户键入其中一个字符,则焦点应从条目#x传递到条目#x + 1,否则焦点应保持原位(在条目#x上)并且应丢弃输入。

我无法丢弃错误的输入:如果用户按下与允许的键不同的键,则Entry字段获取该键,但命令.delete(0,END)不起作用,因为小部件本身尚未记住按下的键。

我该怎么办?

2 个答案:

答案 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)

使用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()

我没有文档参考;我学到了这个here