OnValidate - 注册大量不同的验证

OnValidate - registering lots of different validations

我写了一个 GUI 工具,它有很多可以通过条目更改的变量。 每个条目都有不同的验证规则,我每页只显示大约 20 个项目(条目数组)。我担心当我在切换到下一页之前注册太多验证(在 TK 上)而没有取消注册(?)时,我的程序迟早会崩溃,因为它堆栈?如果是,我该如何注销?

def is_ascii(s):
  try:
    s.decode('ascii')
  except (UnicodeDecodeError,UnicodeEncodeError) :
      return False          
  else:
      return True          

def OnValidate2(i,P,S,char=0,signed=0,bits=0):
  if char:
    if int(i)==0 :
      return is_ascii(S)
    else: return False
  elif signed:
    pass # more to follow

vcmd2 = (root.register(OnValidate2),'%i', '%P','%S',1)
ent = Entry(root, validate="key", validatecommand=vcmd2)  #unregister ??

别担心。无需注销验证功能。请记住,您只需要定义和注册给定的函数一次。注册 OnValidate2 后,您可以将其与任意数量的小部件一起使用。

拥有数十种不同的验证函数似乎很奇怪。您可能需要考虑将几个组合成一个通用例程。例如,如果您有一个检查一个位和一个检查两个位,则您可以有一个函数同时适用于其中任何一个。

下面的示例展示了如何注册单个命令并将其与多个不同的参数一起使用:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        cmd = root.register(self._validate)

        row = 0
        self.grid_columnconfigure(1, weight=1)
        for char in (0,1):
            for signed in (0,1):
                for bits in (0,1,2,3,4,5,6,7):
                    txt = "char: %s signed: %s bits: %2s:" % (char, signed, bits)
                    vcmd = (cmd, "%i", "%P", "%S", char, signed, bits)
                    label = tk.Label(self, text=txt)
                    entry = tk.Entry(self, validate="key", validatecommand=vcmd)
                    label.grid(row=row, column=0)
                    entry.grid(row=row, column=1, sticky="ew")
                    row += 1

    def _validate(self, i,P,S, char=0, signed=0, bits=0):
        print "validating char=", char, "signed=", signed, "bits=", bits,
        print "P=", P, "i=", i, "S=", S
        return True


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()