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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre averti
    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
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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
    Membre averti
    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
    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
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2015, 21h19
  2. Réponses: 9
    Dernier message: 27/05/2014, 16h23
  3. "Remplacer" une fenêtre par une autre
    Par kenda10 dans le forum Débuter
    Réponses: 3
    Dernier message: 18/03/2013, 19h57
  4. Réponses: 4
    Dernier message: 31/10/2007, 20h27
  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, 16h01

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