FAQ Perl/TkConsultez toutes les FAQ

Nombre d'auteurs : 3, nombre de questions : 86, dernière mise à jour : 24 mai 2013  Ajouter une question

 

Bienvenue sur la FAQ Perl/Tk. Cette FAQ a pour vocation de vous enseigner ou de vous faire revoir les notions de Perl/Tk. N'hésitez pas à utiliser le moteur de recherche.

Vous souhaitez participer à l'amélioration de cette FAQ, n'hésitez pas !! Commentez

Bonne lecture !


SommaireTous les widgetsLes boîtes de listes, menus déroulant (Listbox...) (3)
précédent sommaire suivant
 

Pour concevoir un menu déroulant, il faut utiliser le widget BrowseEntry. Il est nécessaire d'appeler le module Tk::BrowseEntry dans votre script. Il est installé avec le module Tk.

BrowseEntry est une classe dérivée du widget Frame (d'un cadre). Toutes les méthodes et options du widget Entry sont utilisables. Si vous souhaitez récupérer la sélection de l'utilisateur, sachez juste que l'option -textvariable a été remplacée par -variable.

Pour en savoir plus, lisez la documentation officielle !
Voici un exemple simple d'utilisation :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl 
use strict; 
use warnings; 
  
use Tk; 
use Tk::BrowseEntry;  
  
my $fenetre_principale = MainWindow->new( -title => 'menu déroulant' ); 
my $mon_choix; 
my $menu_deroulant = $fenetre_principale->BrowseEntry( 
  -label => 'Text label : ', 
  -choices => ['choix1', 'choix2'], 
  -variable => \$mon_choix, 
)->pack(); 
  
# ajouter un choix dans le menu déroulant 
$menu_deroulant->insert('end', 'choix3'); 
  
# label choix 
$fenetre_principale->Label( 
 -textvariable => \$mon_choix, 
)->pack( qw/ -padx 10 -pady 10 / ); 
  
MainLoop;
La sélection s'affiche en temps réel dans le l'étiquette dessous.

Mis à jour le 24 août 2009 djibril

Pour créer une boîte de liste, on utilise le widget Tk::Listbox. Voici un exemple très simple :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl 
use strict; 
use warnings; 
  
use Tk; 
  
my $fenetre_principale = MainWindow->new( -title => 'Boite de liste' ); 
my $liste = $fenetre_principale->Listbox()->pack(); 
$liste->insert( 'end', qw/jasmine jedai djibril stoyak ClaudeLELOUP autre/ ); 
  
MainLoop;
On obtient

Il y a quelques méthodes à connaître :

Méthode Explication Exemple
insert Permet de rajouter des éléments dans la liste $liste->insert('end', element1, element2, element3...);
delete Permet de supprimer des éléments d'une boîte de liste $liste->delete('indice début', 'indice fin');
ou $liste->delete(indice);
get Retourne des éléments de la liste en fonction d'indice donné $liste->get('indice début', 'indice fin');
ou $liste->get(indice);
curselection Elle renvoie un tableau des indices des éléments sélectionnés my @indices_elt_selectionnes = $liste->curselection();
selectionSet Permet de sélectionner une suite d'éléments $liste->selectionSet(0,'end'); (sélectionne tout)
$liste->selectionSet(0);(sélectionne premier élément)
selectionClear Annuler des sélections $liste->selectionClear(0,'end'); (désélectionne tout)
...    
Pour en savoir plus, lisez la documentation officielle.

Voici un exemple de script créant deux boîtes de liste permettant de sélectionner un ou plusieurs éléments d'une boîte pour la passer à une autre :

Code perl : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/perl 
use strict; 
use warnings; 
  
use Tk; 
  
# Création d'une fenêtre 
my $fenetre_principale = MainWindow->new( -title => 'Boites de listes' ); 
  
my $entete1 = $fenetre_principale->Label( -text => 'liste1' ); 
my $liste1 = $fenetre_principale->Scrolled( 
  'Listbox', 
  -scrollbars => 'osoe',       # Ascenseur 
  -selectmode => 'extended'    # Permet le choix multiple 
); 
  
# Insertion de données 
$liste1->insert( 'end', qw/jasmine jedai djibril stoyak ClaudeLELOUP autre/ ); 
  
# Pré-sélectionne le premier élément 
$liste1->selectionSet(0); 
  
my $entete2 = $fenetre_principale->Label( -text => 'liste2' ); 
my $liste2 = $fenetre_principale->Scrolled( 
  'Listbox', 
  -scrollbars => 'osoe',       # Ascenseur 
  -selectmode => 'extended'    # Permet le choix multiple 
); 
  
# Insertion de données 
$liste2->insert( 'end', qw/Perl Tk Qt4 Wx GTk2/ ); 
  
my $bouton1vers2 = $fenetre_principale->Button( 
  -text    => '>>', 
  -command => sub { 
    print "liste 1 => liste 2\n"; 
  
    # Lecture des éléments sélectionnés dans la boîte de liste 1 
    my @elt_selectionnes = $liste1->curselection(); 
    foreach my $elt1 (@elt_selectionnes) { 
  
      # insertion des éléments sélectionnés dans la boîte de liste 2 
      $liste2->insert( 'end', $liste1->get($elt1) ); 
      print "\t => ", $liste1->get($elt1), "\n"; 
    } 
  
    # Suppression dans la boîte de liste 1 des éléments1 copiés dans la boîte de liste 2. 
    # Le reverse permet de commencer la suppression par le plus grand index, car au fur et à mesure 
    # que l'on supprime un élément de la liste, les index décrémentent. 
    map { $liste1->delete($_) } reverse sort { $a <=> $b } @elt_selectionnes; 
  
  }, 
); 
my $bouton2vers1 = $fenetre_principale->Button( 
  -text    => '<<', 
  -command => sub { 
    print "liste 1 <= liste 2\n"; 
  
    # Lecture des éléments sélectionnés dans la boîte de liste 2 
    my @elt_selectionnes = $liste2->curselection(); 
    foreach my $elt2 (@elt_selectionnes) { 
  
      # insertion des éléments sélectionnés dans la boîte de liste 1 
      $liste1->insert( 'end', $liste2->get($elt2) ); 
      print "\t <= ", $liste2->get($elt2), "\n"; 
    } 
  
    # Suppression dans la boîte de liste 2 des éléments copiés dans la boîte de liste 1. 
    # Le reverse permet de commencer la suppression par le plus grand index, car au fur et à mesure 
    # que l'on supprime un élément de la liste, les index décrémentent. 
    map { $liste2->delete($_) } reverse sort { $a <=> $b } @elt_selectionnes; 
  }, 
); 
  
# Utilisation de grid pour placer les widgets dans la fenêtre 
$entete1->grid( '-', $entete2 ); 
$liste1->grid( $bouton1vers2, $liste2 ); 
$liste1->grid( $bouton2vers1, $liste2 ); 
$liste1->grid( -rowspan => 2 ); 
$liste2->grid( -rowspan => 2 ); 
$bouton1vers2->grid( -sticky => 's' ); 
$bouton2vers1->grid( -sticky => 'n' ); 
  
MainLoop;
Résultat :

Il est possible de passer un ou plusieurs éléments de la liste 1 vers la liste 2 (ou inversement) en les sélectionnant, puis en cliquant sur le bouton >> ou <<.

Mis à jour le 31 août 2009 djibril

Il est souvent important d'afficher le dernier élément d'une boîte de liste. En fait, au fur et à mesure de l'insertion de données dans la boîte de liste, il faut manipuler la barre de défilement pour voir le dernier élément. Pour le faire automatiquement, il faut utiliser la méthode see en lui donnant en argument l'indice de l'élément.

Code perl : Sélectionner tout
1
2
$boite_liste->see(0); # Voir le premier élément de la liste 
$boite_liste->see('end'); # Voir le dernier élément de la liste

Mis à jour le 30 septembre 2009 djibril

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2019 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.