不能在validatcommand中传递一个条目作为参数



我正在使用Python 3。x与Tkinter;我想检查一下,一个tkinter的值。通过调用名为"is_valid_entry"的函数,条目是一个数字;并通过validatcommand传递所有参数。我也想对其他条目使用相同的函数。问题是,在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()

我尝试使用一个函数来检查条目文本是否是一个有效的数字。我注册了该函数并配置了该条目,以便在通过validatcommand调用'focusout'时调用该函数。我想传递条目以及(self)作为validatcommand的参数,以便在函数执行时,在无效数字的情况下,条目中的文本被清除。函数内部的entry参数被视为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)

self.delete(0,END)

:

e2.delete(0,END)

相关内容

  • 没有找到相关文章

最新更新