Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

9.9. Les champs de saisie

Le widget gtk.Entry permet la saisie et l'affichage de texte dans une boite, sur une seule ligne. Le texte peut être défini en appelant différentes méthodes, lesquelles peuvent soit remplacer intégralement le contenu courant de la boite, soit y ajouter du texte avant ou après.

La fonction de création d'un champ de saisie est la suivante :

  champsaisie = gtk.Entry(max=0)

Si l'argument max est spécifié, il fixe une limite de longueur au texte du champ de saisie. S'il vaut 0, aucune limite n'est fixée.

La longueur maximale du champ de saisie peut être modifiée avec la méthode :

  champsaisie.set_max_length(max)

La méthode qui suit modifie le texte présent dans le gtk.Entry.

  champsaisie.set_text(text)

La méthode set_text() remplace le contenu courant du champ de saisie par text. Notez que la classe gtk.Entry implémente l'interface Editable (oui, gobject supporte les interfaces "à la Java") qui contient davantage de fonctions pour manipuler le contenu du champ de saisie. Par exemple, la méthode :

  champsaisie.insert_text(text, position=0)

... insère text dans champsaisie, à la position spécifiée.

On peut récupérer le contenu du gtk.Entry en appelant la méthode suivante. Cela nous servira pour notre fonction de rappel, plus bas.

  texte = champsaisie.get_text()

Si l'on ne souhaite pas que le contenu du gtk.Entry puisse être modifié en tapant directement du texte dedans, on peut changer son éditabilité.

  champsaisie.set_editable(is_editable)

La méthode ci-dessus permet de basculer le mode d'éditabilité du champ de saisie en donnant à l'argument is_editable (littéralement : "est éditable") la valeur TRUE (vrai) ou FALSE (faux).

Si l'on utilise le gtk.Entry dans un contexte où le texte saisi ne doit pas être visible, par exemple pour un mot de passe, on peut faire appel à la méthode suivante (qui attend également un drapeau booléen) :

  champsaisie.set_visibility(visible)

La méthode qui suit permet de définir une partie du texte comme sélectionnée, de start (début) à end (fin). Cette option est principalement utilisée dans les cas où l'on fixe un texte par défaut pour le champ de saisie et que l'on souhaite que l'utilisateur puisse le supprimer facilement.

  champsaisie.select_region(start, end)

Si l'on veut être prévenu lorsque l'utilisateur a saisi du texte, on peut se connecter aux signaux "activate" ou "changed". activate (activé) est émis lorsque l'utilisateur appuie sur la touche Entrée dans le widget gtk.Entry, et changed (changé) lorsque un changement est apporté au texte (par exemple pour chaque caractère ajouté ou supprimé).

Le programme d'exemple champsaisie.py illustre l'utilisation d'un widget gtk.Entry. La Figure 9.10 montre ce que l'on obtient en exécutant le programme :

Figure 9.10. Exemple de champ de saisie

exemple champ de saisie

Voici le code source de champsaisie.py :

     1   #!/usr/bin/env python
     2   
     3   # exemple champsaisie.py
     4   
     5   import pygtk
     6   pygtk.require('2.0')
     7   import gtk
     8   
     9   class ExempleSaisieTexte:
    10       def fct_rappel_entree(self, widget, champsaisie):
    11           textesaisi = champsaisie.get_text()
    12           print "Contenu de la champ de saisie : %s\n" % textesaisi
    13   
    14       def champsaisie_editable(self, casecocher, champsaisie):
    15           champsaisie.set_editable(casecocher.get_active())
    16   
    17       def champsaisie_visible(self, casecocher, champsaisie):
    18           champsaisie.set_visibility(casecocher.get_active())
    19   
    20       def __init__(self):
    21           # Creation d'une nouvelle fenetre
    22           fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
    23           fenetre.set_size_request(200, 100)
    24           fenetre.set_title("Saisie de texte GTK")
    25           fenetre.connect("delete_event", gtk.main_quit)
    26   
    27           boite_v = gtk.VBox(False, 0)
    28           fenetre.add(boite_v)
    29           boite_v.show()
    30   
    31           champsaisie = gtk.Entry()
    32           champsaisie.set_max_length(50)
    33           champsaisie.connect("activate", self.fct_rappel_entree, champsaisie)
    34           champsaisie.set_text("salut")
    35           champsaisie.insert_text(" tout le monde", len(champsaisie.get_text()))
    36           champsaisie.select_region(0, len(champsaisie.get_text()))
    37           boite_v.pack_start(champsaisie, True, True, 0)
    38           champsaisie.show()
    39   
    40           boite_h = gtk.HBox(False, 0)
    41           boite_v.add(boite_h)
    42           boite_h.show()
    43                                     
    44           casecocher = gtk.CheckButton("Editable")
    45           boite_h.pack_start(casecocher, True, True, 0)
    46           casecocher.connect("toggled", self.champsaisie_editable, champsaisie)
    47           casecocher.set_active(True)
    48           casecocher.show()
    49       
    50           casecocher = gtk.CheckButton("Visible")
    51           boite_h.pack_start(casecocher, True, True, 0)
    52           casecocher.connect("toggled", self.champsaisie_visible, champsaisie)
    53           casecocher.set_active(True)
    54           casecocher.show()
    55                                      
    56           bouton = gtk.Button(stock=gtk.STOCK_CLOSE)
    57           bouton.connect_object("clicked", gtk.main_quit, fenetre)
    58           boite_v.pack_start(bouton, True, True, 0)
    59           bouton.set_flags(gtk.CAN_DEFAULT)
    60           bouton.grab_default()
    61           bouton.show()
    62           fenetre.show()
    63   
    64   def main():
    65       gtk.main()
    66       return 0
    67   
    68   if __name__ == "__main__":
    69       ExempleSaisieTexte()
    70       main()