在特定情况下触发时,条目验证将停止工作

时间:2015-11-07 11:27:29

标签: python linux windows tkinter

我有一个应用程序。除了一件事,它工作正常。我希望某些标签根据Entry小部件的内容获得不同的背景颜色,如果内容匹配,则应删除条目的内容,以便可以输入更多数据。我做了一个具有相同问题的示例应用程序。

#!/usr/bin/env python

import re
import Tkinter as tk

class Frontend:

    def __init__(self):
        self.root = tk.Tk()
        self.frame = tk.Frame(self.root)
        self.vcmd = (self.frame.register(self.validate), '%P')
        self.entry = tk.Entry(self.frame, vcmd=self.vcmd, validate='key')
        self.label1 = tk.Label(self.frame, text='Foo', bg='green')
        self.label2 = tk.Label(self.frame, text='Bar', bg='green')

        self.frame.pack()
        self.entry.pack()
        self.label1.pack()
        self.label2.pack()

        self.entry.focus()

    def validate(self, inputstring):
        if re.match(r'^foo$', inputstring):
            self.label1.config(bg='red')
            self.entry.delete(0, tk.END)
        elif re.match(r'^bar$', inputstring):
            self.label2.config(bg='red')
            self.entry.delete(0, tk.END)
        elif re.match(r'^delete$', inputstring):
            self.label1.config(bg='green')
            self.label2.config(bg='green')
            self.entry.delete(0, tk.END)
        return True

    def start(self):
        self.root.mainloop()

if __name__ == '__main__':
    root = Frontend()
    root.start()

问题是,在第一次匹配后,Entry小部件的内容被删除。验证命令停止工作。我怀疑这是因为我正在删除导致此问题的条目内容,但我不确定。我已确认Linux主机和Windows主机上存在此问题。

任何人都知道为什么验证会停止执行它想要做的事情?

1 个答案:

答案 0 :(得分:1)

验证不是为了在验证期间支持修改小部件而设计的。来自official documentation

  

在   编辑条目时,validate选项也会将自身设置为none   来自validateCommand或invalidCommand的小部件。   此类版本将覆盖正在验证的版本。

接着说,如果您希望编辑验证中的条目,则在验证完成后使用after_idle重置验证属性。它看起来像这样:

self.entry.after_idle(lambda: self.entry.configure(validate='key'))