En réponse au problème d'orionrobert concernant la gestion de la validation simple lors de substitutions de texte par sélection, au lieu de suppressions ou insertions distinctes :
Une substitution de texte sélectionné est traitée comme une suppression suivie d'une insertion. Cela peut entraîner des problèmes, par exemple, lorsque la suppression doit déplacer le curseur vers la gauche, alors qu'une substitution doit déplacer le curseur vers la droite. Heureusement, ces deux processus sont exécutés immédiatement l'un après l'autre. Ainsi, nous pouvons différencier entre une suppression seule et une suppression suivie immédiatement d'une insertion en raison d'une substitution car cette dernière ne change pas le drapeau inactif entre la suppression et l'insertion.
Ceci est exploité en utilisant un substitutionFlag et un Widget.after_idle()
. after_idle()
exécute la fonction lambda à la fin de la file d'événements :
class ValidatedEntry(Entry):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.tclValidate = (self.register(self.validate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
# attache la fonction de validation enregistrée à cette boîte d'entrée
self.config(validate = "all", validatecommand = self.tclValidate)
def validate(self, type, index, result, prior, indelText, currentValidationMode, reason, widgetName):
if typeOfAction == "0":
# définir un drapeau pouvant être vérifié par la validation d'insertion pour faire partie de la substitution
self.substitutionFlag = True
# stocker les données souhaitées
self.priorBeforeDeletion = prior
self.indexBeforeDeletion = index
# réinitialiser le drapeau après l'inactivité
self.after_idle(lambda: setattr(self, "substitutionFlag", False))
# validation normale de la suppression
pass
elif typeOfAction == "1":
# s'il s'agit d'une substitution, tout est décalé vers la gauche par une suppression, donc annulez cela en utilisant le prior précédent
if self.substitutionFlag:
# rétablir les données souhaitées telles qu'elles étaient lors de la validation de la suppression
prior = self.priorBeforeDeletion
index = self.indexBeforeDeletion
# comportement additionnel facultatif (souvent non requis) lors de la substitution
pass
else:
# validation normale de l'insertion
pass
return True
Bien sûr, après une substitution, lors de la validation de la partie suppression, on ne saura toujours pas si une insertion suivra. Heureusement cependant, avec : .set()
, .icursor()
, .index(SEL_FIRST)
, .index(SEL_LAST)
, .index(INSERT)
, nous pouvons obtenir le comportement souhaité rétrospectivement (puisque la combinaison de notre nouveau substitutionFlag avec une insertion est un nouvel événement unique et final.