Python 如何在tkinter条目小部件中仅插入一些指定字符

Python 如何在tkinter条目小部件中仅插入一些指定字符,python,tkinter,Python,Tkinter,我有一个n个条目小部件的列表。用户应只能键入以下字符:“V”、“F”和“”。如果用户键入其中一个字符,焦点应该从条目#x传递到条目#x+1,否则焦点应该保持在原来的位置(在条目#x上),输入应该被丢弃 我无法放弃错误的输入:如果用户按下的键与允许的键不同,则输入字段将获得该键,但命令.delete(0,END)不起作用,因为小部件本身尚未记住按下的键 我怎么办 将Tkinter作为tk导入 import Tkinter as tk def keyPress(event): if eve

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

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

我怎么办

将Tkinter作为tk导入
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()
def按键(事件): 如果event.char位于('V','F','')中: 打印事件.char elif event.keysym不在('Alt_r','Alt_L','F4'): 打印事件.keysym 返回“中断” root=tk.tk() entry=tk.entry() 条目绑定(“”,按键) entry.pack() entry.focus() root.mainloop()
您可以很容易地分解语句,以便根据键将其转换为不同的形式

event.keysym
部分在那里,因此当您在该小部件中时,可以使用ALT-F4关闭应用程序。如果您只是
else:返回'break'
,那么它也将捕获所有其他击键

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

将Tkinter作为tk导入即可
def按键(事件):
如果event.char位于('V','F','')中:
打印事件.char
elif event.keysym不在('Alt_r','Alt_L','F4'):
打印事件.keysym
返回“中断”
root=tk.tk()
entry=tk.entry()
条目绑定(“”,按键)
entry.pack()
entry.focus()
root.mainloop()
您可以很容易地分解语句,以便根据键将其转换为不同的形式

event.keysym
部分在那里,因此当您在该小部件中时,可以使用ALT-F4关闭应用程序。如果您只是
else:返回'break'
,那么它也将捕获所有其他击键


这也是区分大小写的捕获。如果希望不区分大小写,只需使用
验证
验证命令
选项将其更改为
事件.char.upper()
,这将创建一个
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()

我没有文档参考;我了解到了这一点。

使用
验证
验证命令
选项,这将创建一个
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()

我没有文档参考;我学会了这一点。

谢谢,我错过了“返回'中断'部分”。如果我在它前面插入另一条直线(即使是一条简单的打印语句),它也不起作用。@zar,不客气-
返回“break”
是阻止Tkinter事件传播的方法(即按下按钮等)。实际上,我说的不是真的。如果在“break”之前我插入了另一行,该行在Entry小部件上调用.get()语句。那个电话把一切都搞砸了。再次感谢。我还有一个问题:如何获取输入字段的值?如果光标仍在输入字段上,像x=entry.get()这样的行不会给出正确的值。(我将作为单独的问题发布)谢谢,我缺少了“return'break'”部分。如果我在它前面插入另一条直线(即使是一条简单的打印语句),它也不起作用。@zar,不客气-
返回“break”
是阻止Tkinter事件传播的方法(即按下按钮等)。实际上,我说的不是真的。如果在“break”之前我插入了另一行,该行在Entry小部件上调用.get()语句。那个电话把一切都搞砸了。再次感谢。我还有一个问题:如何获取输入字段的值?如果光标仍在输入字段上,则像x=entry.get()这样的行不会给出正确的值。(我将把它作为单独的问题发布)