如何防止用户在Python 3.8 tkinter Entry小部件中输入字母?



我想限制用户只能在Entry小部件中输入数字。

我已经能够捕获键后,它已被输入和显示,以及提取什么已经在条目小部件;但是我还没有找到一种方法来阻止密钥被添加到输入框中。

我能够对self.entry.get()进行的操作似乎仅限于事件之前。

例如,输入"12b"在下面的代码中,我得到"1b";但我想要的是&;12&;

我试图改变event.char=";但这行不通。

任何帮助都将不胜感激。

# generic python libraries
import tkinter as tk
from tkinter import ttk, END

class MyWindow(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = ttk.Entry(self)
self.entry.grid(row=0, column=0, padx=5, pady=5)
self.entry.bind('<Key>', self.handle_entry_key_press)
def handle_entry_key_press(self, event) -> None:
if not event.char.isdigit():
print(self.entry.get(),  event.char)
self.entry.delete(self.entry.index(END)-1)

if __name__ == "__main__":
root = tk.Tk()
MyWindow(root).grid()
root.mainloop()

您可以使用以下命令:

class MyWindow(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
sv = StringVar()
sv.trace_add("write", lambda _a,_b,_c, sv = sv: self.delete_last_char(sv))
self.entry = ttk.Entry(self, textvariable = sv)
self.entry.grid(row=0, column=0, padx=5, pady=5)
def delete_last_char(self, var):
print(var.get())
var.set("".join([c for c in self.entry.get() if c.isdigit()]))

它不捕获键事件,而是在每次变量更改时检查变量并删除任何非数字字符。

相关内容

  • 没有找到相关文章

最新更新