Question

Jouer avec Python - tkInter - Widget d’entrée - lorsque j’utilise validatecommand (ci-dessous), la vérification a lieu la première fois que la chaîne > Max, mais quand je continue à saisir du texte les étapes de la vérification - il n'y a pas de suppression ou d'insertion après la première fois? Aucun conseil? (en dehors de ne pas construire une application de bureau 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()
Était-ce utile?

La solution

À partir de l'homme de Tk :

  

L'option validate est également définie sur none lorsque vous modifiez le widget d'entrée à partir de validateCommand ou de invalidCommand. De telles éditions remplaceront celle qui était en cours de validation. Si vous souhaitez modifier le widget d'entrée (par exemple, définissez-le sur {}) lors de la validation tout en maintenant le jeu d'options valider, vous devez inclure la commande

.      

après inactivité {% W config -validate% v}

Je ne sais pas comment traduire cela en python.

Autres conseils

Voici un exemple de code qui limitera la saisie à 5 caractères:

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

J'ai ajouté de nombreuses déclarations imprimées pour que vous puissiez voir ce que vous faites dans la console.

Voici les autres substitutions que vous pouvez passer:

   %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.

Je suis sûr que la raison en est exacte, mais j'ai un pressentiment. Le contrôle de validation est effectué chaque fois que l'entrée est modifiée. J'ai fait quelques tests et j'ai constaté qu'il s'exécutait effectivement et que je pouvais faire toutes sortes de choses pendant la validation à chaque fois. Ce qui l’empêche de fonctionner correctement, c’est lorsque vous l’éditez depuis la fonction validatecommand. Cela provoque l'arrêt de l'appel de la fonction de validation. Je suppose qu’il ne reconnaît plus les modifications ultérieures apportées à la valeur d’entrée ou à quelque chose.

lgal Serban semble avoir les informations en coulisse sur les raisons de cette situation.

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