Tk facile - le widget entry

 

ulis, 2006-09-17.

Exercices : copiez-collez les exemples, exécutez-les puis modifiez-les. Durée : 45mn.


Premier script

  entry .e
  grid .e

La commande entry crée un widget entry. La commande grid l'affiche.

La commande entry retourne le nom du widget qu'elle crée. La commande grid peut donc l'utiliser :

  grid [entry .e]

Options standards

  entry .e
  grid .e
  .e configure -bg yellow \
    -font {Courier -16} -width 10

La commande entry a non seulement créé un widget mais aussi une commande. Cette commande s'appelle comme le widget (ici .e) et permet de dialoguer avec lui. L'opération configure permet de modifier l'aspect ou le comportement du widget à travers des options. L'option -bg est une option abrégée qui est synonyme de l'option -background qui contrôle la couleur du fond. L'option -font contrôle elle la police du texte. L'option -width indique la largeur du widet, en nombre de caractères.


Manipulation du texte

Le widget permet d'ajouter, sélectionner, supprimer du texte.

  grid [entry .e -width 20]
  proc demo {} \
  {
    .e delete 0 end
    .e insert 0 "demo du widget entry"
    after 1000
    .e selection range 8 13
    after 1000
    .e delete end-4 end
    after 1000 demo
  }
  demo

L'opération delete permet de supprimer tout ou partie du texte. L'opération insert permet d'insérer du texte à partir d'un certain rang dans le texte existant. L'opération selection range permet de sélectionner tout ou partie du texte.


Récupération de la valeur

L'opération get permet de récupérer la valeur du widget.

  grid [entry .e]
  .e insert 0 "valeur"
  tk_messageBox -message "la valeur du widget est '[.e get]'"


Variable

Plutôt que d'interroger le widget pour connaître sa valeur, on peut demander que cette valeur soit stockée dans une variable globale. Il est alors possible de lire et écrire cette variable. En la lisant on récupère la valeur courante du widget. En l'écrivant, on modifie la valeur courante du widget. ATTENTION : il n'y a aucune vérification de validité dans ce cas.

  set ::value 1
  grid [entry .e -textvariable ::value]
  proc modify {} \
  { incr ::value; after 1000 modify }
  modify

L'option -textvariable doit recevoir le nom d'une variable globale.


Validation de la valeur

ATTENTION : il s'agit d'une difficulté.

Le widget entry permet de demander une valeur à l'utilisateur. Celui-ci peut se tromper et il faut donc vérifier la valeur avant de l'utiliser. Le widget entry permet de vérifier la valeur à mesure que l'utilisateur la tape. C'est, à mon avis, une très mauvaise idée.

Lorsque l'utilisateur se trompe il s'en aperçoit souvent et, dans ce cas, voudra corriger. Une correction automatique lettre par lettre rendra la situation confuse et donnera à votre utilisateur l'impression que vous le prenez, au mieux pour un débile, au pire, pour un robot.

Et s'il ne s'en aperçoit pas ? La seule nécessité que vous avez est de vérifier la valeur avant de l'utiliser. Attendez-donc cet instant (lors de la validation du document saisi par exemple) pour faire toutes les vérifications et, éventuellement, réclamer des modifications.

Pour les irréductibles (ou pour des cas pathologiques) voici quelques éléments sur la validation. Et surtout, ne venez pas pleurez si la validation du widget entry est une opération hasardeuse et pleine de pièges.

Vous pouvez adopter deux stratégies :

La première stratégie est intégrée au widget mais pleine de pièges. La seconde stratégie est générale. Un mixte des deux stratégies est le meilleur moyen d'avoir des ennuis (les deux mécanismes vont se téléscoper).

La meilleure stratégie de validation est d'utiliser un widget adapté au type de la valeur (listbox, spinbox, scale, radiobutton...). Bien utilisés, tous ces widgets empêchent l'utilisateur de fournir une valeur non valide. Et dans ce cas la validation est facile.

Validation par le widget

Faisons l'hypothèse que vous voulez un entier et que vous ne pouvez pas utiliser un widget spinbox ou scale.

  entry .e -validate all -validatecommand {controle %P}
  grid .e
  proc controle {value} \
  { return [string is integer $value] }

Tapez "1.e-7" et vous obtiendrez un magnifique "17".

L'option -validate détermine les circonstances dans lesquelles il faut valider :

L'option -validatecommand (ou -vcmd) reçoit le script qui validera. Ce script doit retourner une valeur booléenne :

Si le script ne renvoie pas une valeur booléenne, l'option -validate perd sa valeur, sans crier gare.

Le script peut être paramétré (comme ici par %P). Voir les paramètres possibles au paragraphe VALIDATION de http://wfr.tcl.tk/entry

Raffinement du raffinement, l'option -invalidcommand permet de faire beugler l'ordinateur (ou autre joyeuseté) quand l'utilisateur se trompe.

Validation par trace

  set ::oldval ""
  grid [entry .e -textvariable ::value]
  trace add variable ::value write controle
  proc controle {value} \
  {
    if {![string is integer $value]} { set ::value $::oldval }
    set ::oldval $::value
  }

Bien entendu, vous pouvez faire les mêmes gags.

La bonne méthode


Voir aussi


Discussion


Catégorie Cours | Catégorie Encyclopédie Tk