divertido Python Tkinter Entry
Pergunta
Brincando com Python - tkinter - Entrada widget - quando eu uso validatecommand (abaixo), a verificação acontece pela primeira vez a string> Max, mas quando eu continuar a introduzir texto os passos de verificação - não há excluir ou inserir após o primeira vez? Algum conselho? (Fora de não construir um aplicativo de desktop via 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()
Solução
Do homem Tk:
A opção Validar também irá definir-se a nenhum quando você editar o widget de entrada a partir de dentro ou o validateCommand ou o invalidCommand. Tais edições irá substituir a que estava sendo validado. Se você deseja editar o widget de entrada (por exemplo, configurá-lo para {}) durante a validação e ainda tem o conjunto de opção de validação, você deve incluir o comando
depois ocioso {% W configuração -validate% v}
não sei como traduzir isso para python.
Outras dicas
Aqui está um exemplo de código que irá limitar a entrada de 5 caracteres:
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()
Eu joguei em um monte de instruções de impressão para que você possa classificar de ver o que está fazendo no console.
Aqui estão as outras substituições que você pode passar:
%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.
Eu sei exatamente qual é o motivo, mas eu tenho um palpite. A verificação de validação é feita toda vez que a entrada é editado. Eu fiz alguns testes e descobriu que ele, de fato, executar e pode fazer todo tipo de coisas durante a validação de cada vez. O que faz com que ele parasse de funcionar corretamente é quando você editá-lo de dentro da função validatecommand. Isso faz com que ele pare de chamar a função de validar ainda mais. Eu acho que já não reconhece mais edições para o valor de entrada ou algo assim.
LGAL Serban parece ter o para trás a informação cenas sobre por que isso ocorre.