无法在 validatecommand 中传递条目作为参数

问题描述 投票:0回答:2

我正在使用 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

python-3.x tkinter tkinter-entry
2个回答
1
投票

解决方法是将小部件存储在带有字符串键的字典中,并在

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'))

0
投票

问题是在 is_valid_entry 内部我无法清除输入文本 与 self.delete(0,END)

self.delete(0,END)

至:

e2.delete(0,END)
© www.soinside.com 2019 - 2024. All rights reserved.