2015-11-07 9 views
1

У меня есть приложение, которое я сделал. Он отлично работает, за исключением одного. Я хочу, чтобы определенные ярлыки получали разные цвета фона в зависимости от содержимого виджета 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

Проверка не предназначена для поддержки модификации виджета во время проверки. Из official documentation:

Опция Validate также установить себя ни при редактировании записи виджета изнутри либо validateCommand или invalidCommand. Такие версии будут переопределять тот, который был проверен.

Это говорит о том, что если вы хотите изменить запись внутри проверки, что вы используете after_idle сбросить атрибут Validate раз завершения проверки. Это будет выглядеть примерно так:

self.entry.after_idle(lambda: self.entry.configure(validate='key')) 
Смежные вопросы