验证回调函数中缺少位置参数
Missing positional argument in an validation callback function
根据 Whosebug 的建议,我应用了验证方法来限制用户输入条目。但是,当我在寄存器语句中插入“is_okay”函数时,Python returns 出现错误代码。这是 Python 的类型错误响应:
TypeError: _register() missing 1 required positional argument: 'func
import tkinter as tk
class Window():
def __init__(self):
tk.Label(master, text ='Fox number').grid(row=0,column=0)
tk.Label(master, text ='Hare number').grid(row=1,column=0)
vcmd = (tk.Entry.register(self.is_okay),'%P')
self.fox_entry=tk.Entry(master,width=5, validate="key", validatecommand = vcmd)
self.fox_entry.grid(row=0, column=1)
self.hare_entry=tk.Entry(master, width=5, validate="key", validatecommand = vcmd)
self.hare_entry.grid(row=1, column=1)
def is_okay(self,value): # entry rule
return isinstance(value,int) and value >= 0
class Ecosystem():
def __init__(self):
self.foxnumber = 10
self.harenumber = 100
def initiate(self):
def input_user(entry):
self.inputvalue = None
def get_value(event):
self.inputvalue = entry.get()
print(self.inputvalue)
return self.inputvalue
entry.bind('<Return>', get_value)
return self.inputvalue
my_win.fox_entry.insert(0,self.foxnumber)
my_win.hare_entry.insert(0,self.harenumber)
self.foxnumber = input_user(my_win.fox_entry)
self.harenumber = input_user(my_win.hare_entry)
master = tk.Tk()
my_win = Window()
my_ecosystem = Ecosystem()
my_ecosystem.initiate()
master.mainloop()```
您提到的错误发生是因为您在 Entry
class 上调用 register
并且您应该在 Entry 实例上调用它。
仔细看看here
下面的代码有效。
import tkinter as tk
class Window():
def __init__(self):
tk.Label(master, text ='Fox number').grid(row=0,column=0)
tk.Label(master, text ='Hare number').grid(row=1,column=0)
self.fox_entry=tk.Entry(master,width=5, validate="key")
self.fox_entry['validatecommand'] =\
self.fox_entry.register(self.is_okay),'%P'
self.hare_entry=tk.Entry(master, width=5, validate="key")
self.hare_entry['validatecommand'] =\
self.hare_entry.register(self.is_okay),'%P'
self.fox_entry.grid(row=0, column=1)
self.hare_entry.grid(row=1, column=1)
def is_okay(self, P):
try:
return P == '' or int(P) >= 0
except:
return False
return True
class Ecosystem():
def __init__(self):
self.foxnumber = 10
self.harenumber = 100
def initiate(self):
def input_user(entry):
self.inputvalue = None
def get_value(event):
self.inputvalue = entry.get()
print(self.inputvalue)
return self.inputvalue
entry.bind('<Return>', get_value)
return self.inputvalue
my_win.fox_entry.insert(0,self.foxnumber)
my_win.hare_entry.insert(0,self.harenumber)
self.foxnumber = input_user(my_win.fox_entry)
self.harenumber = input_user(my_win.hare_entry)
master = tk.Tk()
my_win = Window()
my_ecosystem = Ecosystem()
my_ecosystem.initiate()
master.mainloop()
根据 Whosebug 的建议,我应用了验证方法来限制用户输入条目。但是,当我在寄存器语句中插入“is_okay”函数时,Python returns 出现错误代码。这是 Python 的类型错误响应:
TypeError: _register() missing 1 required positional argument: 'func
import tkinter as tk
class Window():
def __init__(self):
tk.Label(master, text ='Fox number').grid(row=0,column=0)
tk.Label(master, text ='Hare number').grid(row=1,column=0)
vcmd = (tk.Entry.register(self.is_okay),'%P')
self.fox_entry=tk.Entry(master,width=5, validate="key", validatecommand = vcmd)
self.fox_entry.grid(row=0, column=1)
self.hare_entry=tk.Entry(master, width=5, validate="key", validatecommand = vcmd)
self.hare_entry.grid(row=1, column=1)
def is_okay(self,value): # entry rule
return isinstance(value,int) and value >= 0
class Ecosystem():
def __init__(self):
self.foxnumber = 10
self.harenumber = 100
def initiate(self):
def input_user(entry):
self.inputvalue = None
def get_value(event):
self.inputvalue = entry.get()
print(self.inputvalue)
return self.inputvalue
entry.bind('<Return>', get_value)
return self.inputvalue
my_win.fox_entry.insert(0,self.foxnumber)
my_win.hare_entry.insert(0,self.harenumber)
self.foxnumber = input_user(my_win.fox_entry)
self.harenumber = input_user(my_win.hare_entry)
master = tk.Tk()
my_win = Window()
my_ecosystem = Ecosystem()
my_ecosystem.initiate()
master.mainloop()```
您提到的错误发生是因为您在 Entry
class 上调用 register
并且您应该在 Entry 实例上调用它。
仔细看看here
下面的代码有效。
import tkinter as tk
class Window():
def __init__(self):
tk.Label(master, text ='Fox number').grid(row=0,column=0)
tk.Label(master, text ='Hare number').grid(row=1,column=0)
self.fox_entry=tk.Entry(master,width=5, validate="key")
self.fox_entry['validatecommand'] =\
self.fox_entry.register(self.is_okay),'%P'
self.hare_entry=tk.Entry(master, width=5, validate="key")
self.hare_entry['validatecommand'] =\
self.hare_entry.register(self.is_okay),'%P'
self.fox_entry.grid(row=0, column=1)
self.hare_entry.grid(row=1, column=1)
def is_okay(self, P):
try:
return P == '' or int(P) >= 0
except:
return False
return True
class Ecosystem():
def __init__(self):
self.foxnumber = 10
self.harenumber = 100
def initiate(self):
def input_user(entry):
self.inputvalue = None
def get_value(event):
self.inputvalue = entry.get()
print(self.inputvalue)
return self.inputvalue
entry.bind('<Return>', get_value)
return self.inputvalue
my_win.fox_entry.insert(0,self.foxnumber)
my_win.hare_entry.insert(0,self.harenumber)
self.foxnumber = input_user(my_win.fox_entry)
self.harenumber = input_user(my_win.hare_entry)
master = tk.Tk()
my_win = Window()
my_ecosystem = Ecosystem()
my_ecosystem.initiate()
master.mainloop()