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

zar*_*zar 1 python tkinter

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

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

我该怎么办?

Way*_*ner 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()
Run Code Online (Sandbox Code Playgroud)

您可以轻松地分解语句,以便根据键将其转换为其他形式.

event.keysym部分在那里,所以你可以ALT-F4关闭应用程序当你在该小部件.如果你else: return 'break'那时它也将捕获所有其他击键.

这也是区分大小写的捕获.如果您想要不区分大小写,只需将其更改为event.char.upper()


unu*_*tbu 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()
Run Code Online (Sandbox Code Playgroud)

我没有文档参考;我在这里学到了这一点。