Python Tkinter Entry 小部件中的 CTRL-V 问题

Python issue with CTRL-V in Tkinter Entry widget

在条目小部件中,我尝试使用 validatecommand 和一个函数来将值限制为仅十六进制,以验证条目值是否在 'abcdef0123456789' 中。问题在于 "CTRL+V" (粘贴)在我使用它来插入值时不起作用。 "CTRL+C"和"CTRL+X"(复制剪切)都没有问题。

这是一种将条目限制为十六进制值并同时允许使用 CTRL-V 来获得 Paste/insert 值的方法吗?

Is that a way to restrict the entry to hexadecimal value and in same time allow the use of CTRL-V to Paste/insert value?

是的。可以说,最简单的方法是使用 validatecommand 来检查小部件中的所有字符是否都是十六进制数字。 validatecommand 不关心字符的输入方式(键入与 cut/paste)。

在下面的示例中,'%P' 告诉 tkinter 如果允许编辑则传递条目小部件的新值。然后我们可以使用 re 模块来查看新值是否仅由零个或多个十六进制数字组成。

import tkinter as tk
import re

def validate(possible_new_value):
    if re.match(r'^[0-9a-fA-F]*$', possible_new_value):
        return True
    return False

root = tk.Tk()
entry = tk.Entry(root, validate="key", 
                 validatecommand=(root.register(validate), '%P'))
entry.pack(padx=20, pady=20)
root.mainloop()