2015-11-07 57 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'))