2015-11-07 33 views
1

我有我提出的一个应用程序。除了一件事以外,它工作正常。我希望某些标签根据Entry小部件的内容获取不同的背景颜色,并且如果内容匹配,则应删除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() 

的问题是,在第一时间匹配的东西后输入构件的内容被删除。验证命令停止工作。我怀疑这是事实,我删除了导致此问题的条目的内容,但我不确定。我已确认Linux主机和Windows主机上存在此问题。

任何人都有一个想法,为什么验证停止做它应该做的事情?

回答

1

验证的目的不是为了在验证过程中支持小部件的修改。从official documentation

的 验证选项也将自身设置为无,当你无论从validateCommand或invalidCommand内编辑的条目 部件。 此类版本将覆盖正在验证的版本。

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

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