【问题标题】:How to insert only some specified characters in a tkinter Entry widget如何在 tkinter 条目小部件中仅插入一些指定的字符
【发布时间】:2010-08-13 16:31:41
【问题描述】:

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

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

我该怎么办?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:
    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'”部分。如果我在它之前插入另一个 linea(甚至是一个简单的 print 语句),它就不起作用。
    • @zar,不客气 - return 'break' 是您阻止 Tkinter 事件传播的方式(即按下按钮等)。
    • 其实我说的不是真的。如果在“break”之前我插入了另一行,它在 Entry 小部件上调用 .get() 语句。那个电话把一切都搞砸了。再次感谢。
    • 我还有一个问题:如何获取Entry字段的值?如果光标仍在输入字段上,则像 x=entry.get() 这样的行不会给出正确的值。
    • (我将把它作为一个单独的问题发布)
    【解决方案2】:

    使用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。

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多