我正在使用 Python 3.x 和 Tkinter;我想通过调用名为
tkinter.Entry
的函数并通过 is_valid_entry
传递所有 args 来检查 validatecommand
的值是否是一个数字。我也想对其他条目使用相同的功能。
问题是在is_valid_entry
内部我无法用self.delete(0,END)
清理输入文本,因为self
被视为str
而不是tkinter.Entry
。
我希望我能让人理解
感谢您的帮助!
这是代码:
from tkinter import *
from tkinter import ttk
from tkinter import filedialog as fd
import tkinter as tk
window = tk.Tk()
window.geometry("600x600")
window.title("Hello Stackoverflow")
window.resizable(False,False)
def isfloat(value):
try:
float(value)
return True
except ValueError:
return False
def is_valid_entry(self,value):
if (value.isnumeric() or isfloat(value)):
return True
else:
tk.messagebox.showerror(title="Error!", message="Value must be a number!")
print(type(self))
self.delete(0,END) # I'd like to clean the entry text but self is type string now not type tkinter.Entry
return False
e2=tk.Entry(window,width=20)
e2.grid(row=6,column=2,padx=5)
print(type(e2))
okayCommand = e2.register(is_valid_entry)
e2.config(validate='focusout',validatecommand=(okayCommand,e2,'%P'))
if __name__ == "__main__":
window.mainloop()
我尝试使用一个函数来检查输入文本是否是有效数字。我通过
validatecommand
注册了该函数并配置了在“焦点消失”时调用该函数的条目。我想将 tkinter.Entry
以及(自身)作为 validatecommand
的 args传递,以便在执行函数时,如果数字无效,条目中的文本将被清除。函数内的入口参数被视为
str
而不是 tkinter.Entry
。
解决方法是将小部件存储在带有字符串键的字典中,并在
config
设置中传递该键。
def is_valid_entry(value, widgetname):
if (value.isnumeric() or isfloat(value)):
return True
else:
tk.messagebox.showerror(title="Error!", message="Value must be a number!")
mywidgets[widgetname].delete(0,END)
return False
e2=tk.Entry(window,width=20)
e2.grid(row=6,column=2,padx=5)
mywidgets = dict()
mywidgets["e2"] = e2
print(type(e2))
okayCommand = e2.register(is_valid_entry)
e2.config(validate='focusout',validatecommand=(okayCommand,'%P','e2'))
问题是在 is_valid_entry 内部我无法清除输入文本 与 self.delete(0,END)
self.delete(0,END)
至:
e2.delete(0,END)