วิธีส่งค่าไปยังรายการ validatecommand

Sep 15 2020

ฉันกำลังตรวจสอบแบบฟอร์มใน tkinter โดยใช้validatecommandไฟล์. มีสองรายการรายการหนึ่งควรยอมรับเฉพาะจำนวนเต็มและอีกรายการหนึ่ง
นี่คือรหัสพื้นฐาน:

import tkinter as tk
class Form(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        validCmd1 = (self.register(self.val1), "%P")
        validCmd2 = (self.register(self.val2), "%P")
        self.lab1 = tk.Label(self, text = "Float:")
        self.lab1.grid(row = 1, column = 0, padx = 10, pady = 10)
        self.ent1 = tk.Entry(self, validate = "key", validatecommand = validCmd1)
        self.ent1.grid(row = 1, column = 1)
        self.lab2 = tk.Label(self, text = "Integer:")
        self.lab2.grid(row = 2, column = 0, padx = 10, pady = (0,10))
        self.ent2 = tk.Entry(self, validate = "key", validatecommand = validCmd2)
        self.ent2.grid(row = 2, column = 1)
    def val1(self, value):
        try:
            float(value)
        except:
            return False
        else:
            return True
    def val2(self, value):
        try:
            int(value)
        except:
            return False
        else:
            return True
app = Form()
app.mainloop()

แทนที่จะเขียนสองฟังก์ชันที่แตกต่างกันสำหรับสองงานที่คล้ายกันมากฉันพยายามส่งจำนวนเต็มไปยังคำสั่ง validate (1 สำหรับ float, 2 สำหรับจำนวนเต็ม) ผมพยายามที่จะใช้ lambdas จะผ่านค่าฟังก์ชั่นการตรวจสอบครั้งแรกในส่วน self.register นี้self.register(lambda: self.val1(1))แต่ให้TypeError: <lambda>() takes 0 positional arguments but 1 was givenและครั้งที่สองฉันพยายามใช้แลมบ์ดาคำสั่ง validatecommand นี้ซึ่งจะช่วยให้validatecommand = lambda: validCmd1(1) เป็นไปได้ไหมที่จะส่งผ่านค่าไปยังคำสั่งตรวจสอบความถูกต้อง?TypeError: 'tuple' object is not callable

คำตอบ

1 BryanOakley Sep 15 2020 at 20:31

validatecommandตัวเลือกที่จะใช้เวลา tuple ที่สามารถมีข้อโต้แย้งใด ๆ ที่คุณต้องการ ตัวอย่างเช่นหากคุณต้องการส่งจำนวนเต็มก็ทำได้ง่ายๆดังนี้:

validCmd1 = (self.register(self.val), 1, "%P")
validCmd2 = (self.register(self.val), 2, "%P")

def val(self, arg, value):
    print(f"val1 arg='{arg}' value='{value}'")
    ...

validatecommandบางครั้งก็เป็นเรื่องง่ายที่จะเข้าใจถ้าคุณแยกการลงทะเบียนของคำสั่งจากค่าที่ส่งผ่านไปในการ ตัวอย่างเช่น:

vcmd = self.register(self.val)
...
self.ent1 = tk.Entry(..., validatecommand = (vcmd, 1, "%P"))
self.ent2 = tk.Entry(..., validatecommand = (vcmd, 2, "%P"))