代码之家  ›  专栏  ›  技术社区  ›  meade

python tkinter入门乐趣

  •  2
  • meade  · 技术社区  · 15 年前

    在使用python-tkinter-entry小部件时,当我使用validatecommand(下面)时,在字符串>max第一次执行检查,但当我继续输入文本时,检查步骤-第一次之后没有删除或插入?有什么建议吗?(不通过python构建桌面应用程序的外部)


    #!/usr/bin/env python
    from Tkinter import *
    
    class MyEntry(Entry):
    
        def __init__(self, master, maxchars):
            Entry.__init__(self, master, validate = "key",    validatecommand=self.validatecommand)
            self.MAX = maxchars
    
        def validatecommand(self, *args):
            if len(self.get()) >= self.MAX:
                self.delete(0,3)
                self.insert(0, "no")
            return True
    
    if __name__ == '__main__':
        tkmain = Tk()
        e = MyEntry(tkmain, 5)
        e.grid()
        tkmain.mainloop()
    
    3 回复  |  直到 13 年前
        1
  •  3
  •   Igal Serban    15 年前

    From the Tk man :

    当您从validatecommand或invalidcommand中编辑entry小部件时,validate选项还将自己设置为none。这些版本将覆盖正在验证的版本。如果您希望在验证期间编辑entry小部件(例如,将其设置为),并且仍然设置了validate选项,则应包括命令

    空闲%w配置后-验证%v_

    不知道如何将其转换为python。

        2
  •  2
  •   jgritty    13 年前

    下面是将输入限制为5个字符的代码示例:

    import Tkinter as tk
    
    master = tk.Tk()
    
    def callback():
        print e.get()
    
    def val(i):
        print "validating"
        print i
    
        if int(i) > 4:
            print "False"
            return False
        return True
    
    vcmd = (master.register(val), '%i')
    
    e = tk.Entry(master, validate="key", validatecommand=vcmd)
    e.pack()
    
    b = tk.Button(master, text="OK", command=lambda: callback())
    b.pack()
    
    tk.mainloop()
    

    我输入了一堆打印语句,这样你就可以在控制台中看到它在做什么了。

    以下是您可以通过的其他替换:

       %d   Type of action: 1 for insert, 0  for  delete,  or  -1  for  focus,
            forced or textvariable validation.
    
       %i   Index of char string to be inserted/deleted, if any, otherwise -1.
    
       %P   The value of the entry if the edit is allowed.  If you are config-
            uring  the  entry  widget to have a new textvariable, this will be
            the value of that textvariable.
    
       %s   The current value of entry prior to editing.
    
       %S   The text string being inserted/deleted, if any, {} otherwise.
    
       %v   The type of validation currently set.
    
       %V   The type of validation that triggered the callback (key,  focusin,
            focusout, forced).
    
       %W   The name of the entry widget.
    
        3
  •  1
  •   Tofystedeth    15 年前

    我很确定是什么原因,但我有预感。每次编辑条目时都会进行验证检查。我做了一些测试,发现它确实可以执行,并且每次都可以在验证期间做各种事情。当您从validatecommand函数中编辑它时,会导致它停止正常工作。这会导致它停止进一步调用validate函数。我想它不再识别对条目值或其他内容的进一步编辑。

    lgal serban似乎掌握了这一现象发生的幕后信息。