Pergunta

Estou a escrever algum código em python e estou tendo problemas ao tentar recuperar o conteúdo de um widget Entry. A coisa é: eu quero limitar os caracteres que podem ser digitados, então eu estou tentando limpar a entrada do widget quando eu chegar ao número específico de caracteres (2 neste caso), mas parece que eu sempre perder o último digitado personagem. Eu adicionei o personagem perdido em uma impressão para show.

Aqui está o código de exemplo:

from Tkinter import *
class sampleFrame:
    def __init__(self, master):
        self.__frame = Frame(master)
        self.__frame.pack()
    def get_frame(self):
        return self.__frame


class sampleClass:
    def __init__(self, master):
        self.__aLabel = Label(master,text="aLabel", width=10)
        self.__aLabel.pack(side=LEFT)
        self.__aEntry = Entry (master, width=2)
        self.__aEntry.bind('<Key>', lambda event: self.callback(event, self.__aEntry))
        self.__aEntry.pack(side=LEFT)

    def callback(self, event, widgetName):
        self.__value = widgetName.get()+event.char
        print self.__value
        if len(self.__value)>2:
            widgetName.delete(2,4)





root = Tk()
aSampleFrame = sampleFrame(root)
aSampleClass = sampleClass(aSampleFrame.get_frame())
root.mainloop()

Qualquer ajuda será muito apreciada!

Agradecemos antecipadamente

Foi útil?

Solução

Em primeiro lugar, depois de fazer a exclusão, o evento continua com seu processamento normal, ou seja, o personagem é inserido. Você precisa sinalizar para Tkinter que o evento deve ser ignorado.

Assim, no seu código acima, adicione a linha marcada:

if len(self.__value) > 2:
    widgetName.delete(2,4)
    return "break" # add this line

Por outro lado, por que você vá através do lambda? Um evento tem um atributo .widget que você pode usar. Então você pode mudar seu código em:

    self.__aEntry.bind('<Key>', self.callback) # ※ here!
    self.__aEntry.pack(side=LEFT)

def callback(self, event):
    self.__value = event.widget.get()+event.char # ※ here!
    print self.__value
    if len(self.__value)>2:
        event.widget.delete(2,4) # ※ here!
        return "break"

Todas as linhas alteradas são marcadas com "aqui!"

Outras dicas

Para ser um pouco mais específico, os widgets Tk tem o que são chamados de "bindtags". Quando um evento é processado, cada bindtag no widget é considerado, a fim de ver se ele tem uma ligação. Um widget por padrão terá como bindtags o widget, a classe widget, o widget de raiz, e "todos". Assim, as ligações para o widget irá ocorrer antes de as ligações padrão. Uma vez que sua ligação foi processado você pode evitar novos bindtags de ser considerado por retornando um "break".

As ramificações são o seguinte: se você faz uma ligação no widget, classe, janela de raiz e "todas as" ligações pode disparar também. Além disso, qualquer ligação de anexar aos widget dispara antes a ligação que é onde o comportamento padrão (por exemplo: a inserção de um personagem) classe acontece. É importante estar ciente de que, em situações onde você pode querer manipular o evento após o comportamento padrão em vez de antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top