Question

J'écris du code en python et je ne parviens pas à récupérer le contenu d'un widget Entry. La chose est la suivante: je veux limiter les caractères qui peuvent être saisis, alors j'essaie d'effacer le widget Entrée lorsque j'atteins le nombre spécifique de caractères (2 dans ce cas), mais il me semble que je manque toujours le dernier saisi personnage. J'ai ajouté le personnage perdu dans une impression à afficher.

Voici l'exemple de code:

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()

Toute aide sera très appréciée!

Merci d'avance

Était-ce utile?

La solution

Tout d'abord, après la suppression, l'événement se poursuit avec son traitement normal, c'est-à-dire que le caractère est inséré. Vous devez signaler à Tkinter que l'événement doit être ignoré.

Donc, dans votre code ci-dessus, ajoutez la ligne marquée:

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

D'autre part, pourquoi passez-vous par le lambda? Un événement a un attribut .widget que vous pouvez utiliser. Vous pouvez donc changer votre code en:

    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"

Toutes les lignes modifiées sont signalées par "ici!"

Autres conseils

Pour être un peu plus spécifiques, les widgets Tk ont ??ce qu’on appelle des "bindtags". Lorsqu'un événement est traité, chaque bindtag du widget est considéré afin de voir s'il a une liaison. Un widget par défaut aura pour marqueur le widget, la classe du widget, le widget racine et "tout". Ainsi, les liaisons au widget auront lieu avant les liaisons par défaut. Une fois que votre liaison a été traitée, vous pouvez empêcher la prise en compte de toute autre marque de lien en renvoyant une "interruption".

Les ramifications sont les suivantes: si vous créez une liaison sur le widget, la classe, la fenêtre racine et "tout". les reliures peuvent également tirer. En outre, toute liaison que vous associez au widget est déclenchée avant par la liaison de classe à l’endroit où se produit le comportement par défaut (par exemple, l’insertion d’un caractère). Il est important de prendre conscience de cela dans les situations où vous souhaiterez peut-être gérer l'événement après le comportement par défaut plutôt qu'avant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top