在一个验证回调函数中缺少位置参数。

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

根据stackoverflow的建议,我采用了验证方法来约束用户输入的条目。然而,当我在寄存器状态下插入'is_okay'函数时,Python返回了一个错误代码。这就是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()```


python validation tkinter tkinter-entry
1个回答
1
投票

你提到的错误发生是因为你调用了 register 在...上 Entry 类,并且你应该在一个 Entry 实例上调用它。

仔细研究一下 此处

下面的代码可以用。

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()
© www.soinside.com 2019 - 2024. All rights reserved.