IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

[Perl/Tk] Actualisation d'une fenêtre par une commande


Sujet :

Interfaces Graphiques Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut [Perl/Tk] Actualisation d'une fenêtre par une commande
    Bonjour,

    J'ai un souci avec l'actualisation d'une fenêtre, suite à l'exécution d'une commande via un bouton placé dans une autre fenêtre.

    Voici un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    # !/usr/bin/perl -w
     
    use warnings;
    use strict;
     
    use Tk;
     
    # ===============================================================================================
     
    my @tab = (0);
     
    # ===============================================================================================
     
    my $main = MainWindow->new();
    	my $frame1 = $main->Frame()->pack();
    		my $frameG = $frame1->Frame()->pack(-side=>'left');
    			my $button = $frameG->Button(-text=>'Fonction', -command=>\&fonct)->pack();
    		my $frameD = $frame1->Frame()->pack(-side=>'right');
    			foreach (@tab) { my $checkbutton = $frameD->Checkbutton(-text=>"$_")->pack(); }
     
    MainLoop;
     
    # ===============================================================================================
     
    sub fonct { @tab = (1, 2); $frameD->update; }
    Ce que j'aimerais faire, c'est rafraîchir ma fenêtre $frameD en prenant en compte la nouvelle composition du tableau @tab.
    Dans l'exemple précédent, il me semblait qu'en appelant la fonction, on exécutait également la méthode update, mais ce n'est pas le cas.

    Quelle est la chose qui m'échappe dans ce que j'ai écrit ?
    Merci d'avance pour vos éclaircissements...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Je ne dois pas avoir tout à fait compris le fonctionnement de la méthode update

    Bref, arrêtez-moi si je dis une bêtise, mais on doit passer par la méthode destroy pour réaliser un vrai rafraîchissement de la fenêtre, c'est bien ça ?

    Dans ce cas, j'ai effectivement une fenêtre qui s'actualise avec la modification suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub fonct {
    	@tab = (2, 3, 4);
    	$frameD->destroy;
    	$frameD = $frame1->Frame()->pack(-side=>'right');
    	foreach (@tab) { my $checkbutton = $frameD->Checkbutton(-text=>"$_")->pack(); }
    }
    Y-a-t-il plus simple, ou mes recherches ont été fructueuses ?

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    La méthode update est suffisante pour rafraichir un widget. Destroy ne fait que la détruire, donc ça n'a pas de sens.
    Maintenant, tout dépend de ce que fait concrètement votre programme. Vous avez surement un problème d'algorithme. Il faudrait nous dire ce que fait concrètement votre code et surtout ce que vous souhaitiez faire, puis s'il vous plait, apprenez à indenter votre code avant de la présenter car cela ne donne pas envie de le lire.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Je n'ai jamais appris à indenter le code, et j'ai du coup appris à le rendre visible "à ma façon"...

    Voici le code présenté autrement, je vais essayer de prendre le temps d'apprendre à indenter correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    # !/usr/bin/perl -w
     
    use warnings;
    use strict;
     
    use Tk;
     
    # ===============================================================================================
     
    my @tab = (0, 1);
     
    # ===============================================================================================
     
    # Création de la fenêtre principale (Niv 1)
    my $main = MainWindow->new();
    	# Création d'une fenêtre à gauche (Niv 2)
    	my $frameG = $main->Frame()->pack(-side=>'left');
    		# Création d'un bouton (Niv 3) dans la fenêtre de gauche appelant la fonction "fonct"
    		my $button = $frameG->Button(
    			-text=>'Fonction',
    			-command=>\&fonct
    		)->pack();
    	# Création d'une fenêtre à droite (Niv 2)
    	my $frameD = $main->Frame()->pack(-side=>'right');
    		# Création d'une série de checkbuttons (Niv 3) dans la fenêtre de droite
    		foreach (@tab)
    		{
    			my $checkbutton = $frameD->Checkbutton(
    				-text=>"$_"
    			)->pack();
    		}
     
    MainLoop;
     
    # ===============================================================================================
     
    # fonct modifie le contenu du tableau @tab et met à jour la fenêtre frameD
    sub fonct
    {
    	@tab = (2, 3, 4);
    	# Destruction de la fenêtre de droite (Niv 2)
    	$frameD->destroy;
    	# Re-création de la fenêtre de droite (Niv 2)
    	$frameD = $main->Frame()->pack(-side=>'right');
    		# Re-création d'une série de checkbuttons (Niv 3) dans la fenêtre de droite
    		foreach (@tab)
    		{
    			my $checkbutton = $frameD->Checkbutton(
    				-text=>"$_"
    			)->pack();
    		}
    }
    Voici ce que j'aimerais que ce bout de code fasse :
    Je crée un certain nombre de checkbuttons (dans la frame de droite) en fonction de ma variable @tab.
    La commande associée au bouton créé dans la frame de gauche modifie la variable @tab, et j'aimerais qu'elle modifie le nombre de checkbuttons de l'autre frame grâce à la méthode update.

    Quand je définis ma fonction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # fonct modifie le contenu du tableau @tab et met à jour la fenêtre frameD
    sub fonct
    {
    	@tab = (2, 3, 4);
    	# Mise à jour de la fenêtre de droite (Niv 2)
    	$frameD->update;
    }
    ma frame de droite ne change pas.

    Avec la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # fonct modifie le contenu du tableau @tab et met à jour la fenêtre frameD
    sub fonct
    {
    	@tab = (2, 3, 4);
    	# Destruction de la fenêtre de droite (Niv 2)
    	$frameD->destroy;
    	# Re-création de la fenêtre de droite (Niv 2)
    	$frameD = $main->Frame()->pack(-side=>'right');
    		# Re-création d'une série de checkbuttons (Niv 3) dans la fenêtre de droite
    		foreach (@tab)
    		{
    			my $checkbutton = $frameD->Checkbutton(
    				-text=>"$_"
    			)->pack();
    		}
    }
    ma frame de droite est bien à jour.

    Est-ce que je n'ai pas de rafraîchissement de ma fenêtre de droite parce que les checkbuttons ne peuvent pas être modifiés, mais doivent être supprimés puis recréés ?
    Est-il plus correct de supprimer les checkbuttons et d'en créer de nouveau suivant la nouvelle définition de @tab ?

    (Edit : Merci Lolo78)

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Indente tes commentaires au moins autant que le code qui les entoure, sinon ils attirent l’œil plus que le code.


  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Votre souci est purement algorithmique.
    en utilisant cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub fonct
    {
    	@tab = (2, 3, 4);
    	# Mise à jour de la fenêtre de droite (Niv 2)
    	$frameD->update;
    }
    C'est tout à fait normal que la fenêtre ne change pas. Ce n'est pas parce que une variable change, notamment @tab que les widgets vont changer. Tout doit se coder. update rafraichit la fenêtre, mais si rien n'a changé à l'intérieur, bah rien ne changera.

    C'est donc à vous de coder ces changements, ce que vous avez fait en modifiant votre fonction en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # fonct modifie le contenu du tableau @tab et met à jour la fenêtre frameD
    sub fonct
    {
    	@tab = (2, 3, 4);
    	# Destruction de la fenêtre de droite (Niv 2)
    	$frameD->destroy;
    	# Re-création de la fenêtre de droite (Niv 2)
    	$frameD = $main->Frame()->pack(-side=>'right');
    		# Re-création d'une série de checkbuttons (Niv 3) dans la fenêtre de droite
    		foreach (@tab)
    		{
    			my $checkbutton = $frameD->Checkbutton(
    				-text=>"$_"
    			)->pack();
    		}
    }
    Maintenant, niveau algorithme, il faut se poser la question de l'utilité de vos checkbutton. Qu'elle est leur rôle ? Car au lieu de supprimer et en recréer il y a peut-être une autre façon de faire ou même, il serait peut-être plus judicieux d'utiliser un autre widget.
    Il faudrait en savoir plus sur ce que vous souhaitez faire, qu'elle est le but de votre interface graphique ? En fonction des réponses, je pourrai vous guider dans un meilleur choix de widget.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Le programme que je tente de réaliser est en fait assez personnel, je ne désire pas vraiment dévoiler ici mon code

    Voilà pourquoi j'essaye de comprendre par un exemple simple.

    Ce que j'aimerais faire avec ces checkbuttons, c'est de proposer à l'utilisateur d'en cocher un certain nombre (à son gré), et un bouton "Valider" devrait permettre d'enregistrer dans un fichier le contenu du texte associé au checkbutton.
    N'ayant pas l'habitude de perl/tk, je suis parti sur l'idée des checkbuttons plutôt que de créer un bouton "Valider" pour chaque valeur de @tab, tableau à partir duquel je crée mes checkbuttons...

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Bon, difficile de faire plus avec peu d'informations, néanmoins, je vais essayer de te faire un petit programme.
    Je te recommande aussi la lecture de notre FAQ Perl/Tk.

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Voici un exemple de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    # !/usr/bin/perl
    use warnings;
    use strict;
     
    use Tk;
     
    my $main = MainWindow->new();
     
    my $frameG = $main->Frame();
    my $frameD = $main->Frame();
     
    my @MesCheckButton;
     
    # Spinbox permettant le choix de valeurs
    my $Spinbox = $frameG->Spinbox(
      -from     => 1,
      -to       => 10,
      -width    => 10,
      -validate => 'key'
    );
    my $button = $frameG->Button(
      -text    => 'Creer des CheckButton',
      -command => [ \&fonct, $frameD, $Spinbox ],
    );
     
    $frameG->pack(qw/ -side left -padx 5 -pady 5/);
    $frameD->pack(qw/ -side right -padx 5 -pady 5/);
    $Spinbox->pack(qw/ -pady 5/);
    $button->pack(qw/ -pady 5/);
     
    MainLoop;
     
    sub fonct {
      my ( $cadreDroit, $SpinBoxChoix ) = @_;
     
      # Supprimons les checkbutton affichés
      foreach (@MesCheckButton) { $_->destroy(); }
      @MesCheckButton = ();
     
      # Création de nouveaux CheckButton
      my $nombre_Checkbutton = $SpinBoxChoix->get();
      if ( $nombre_Checkbutton > 0 ) {
        for ( 1 .. $nombre_Checkbutton ) {
          my $Checkbutton = $cadreDroit->Checkbutton( -text => $_ )->pack();
     
          # stockage des widgets
          push @MesCheckButton, $Checkbutton;
        }
      }
     
      return;
    }

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci Djibril, c'est bien par la suppression des checkbuttons qu'il fallait donc passer (et pas la structure qui les contient).
    Il est vrai que ce n'est pas facile de voir ce que je veux faire sans plus de précisions, mais j'étais surtout bloqué par la méthode update que j'imaginais faire plus de choses qu'elle ne peut en réalité.

    En tout cas, ton exemple me montre comment rendre mon code plus lisible, c'est certain.

    Je vais aussi lire plus attentivement la FAQ Perl que je n'avais que jusque là survolée en cherchant rapidement si je pouvais trouver des solutions, et aussi les cours et tutoriels de formation pour apprendre Perl : http://perl.developpez.com/cours/

    Merci encore de s'être penché sur la question !

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    La méthode update ne fait pas ce dont tu penses. Elle n'est pas là pour coder à ta place les widgets. Tout dépend de ton algorithme.

    Bon courage pour la suite !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2015, 22h19
  2. Réponses: 9
    Dernier message: 27/05/2014, 17h23
  3. "Remplacer" une fenêtre par une autre
    Par kenda10 dans le forum Débuter
    Réponses: 3
    Dernier message: 18/03/2013, 20h57
  4. Réponses: 4
    Dernier message: 31/10/2007, 21h27
  5. Contrôle d'une fenêtre par une autre classe
    Par SuperWeight dans le forum Windows
    Réponses: 4
    Dernier message: 19/04/2007, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo