python-3.x 无法将条目作为参数传递到validatecommand中

dfty9e19  于 2023-01-18  发布在  Python
关注(0)|答案(2)|浏览(160)

我使用Python 3.x和Tkinter;我想通过调用一个名为“is_valid_entry”的函数并通过validatecommand传递所有参数来检查tkinter.Entry的值是否是一个数字。我也想对其他条目使用相同的函数。问题是在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()

我尝试使用一个函数来检查条目文本是否为有效数字。我注册了该函数并配置了条目,以便在“focusout”的情况下通过validatecommand调用此函数。我也希望传递该条目(self)作为validatecommand的参数,以便当执行函数时,在无效数字的情况下,条目中的文本被清除。2函数中的条目参数被看作一个str而不是tkinter. Entry。

qni6mghb

qni6mghb1#

一种解决方法是将小部件存储在带有字符串键的字典中,并在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'))
ocebsuys

ocebsuys2#

问题是在is_valid_entry中,我无法使用self.delete(0,END)清除条目文本

self.delete(0,END)

致:

e2.delete(0,END)

相关问题