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 bind pour contrôler un while


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut Perl Tk bind pour contrôler un while
    Bonjour,
    Je cherche comment contrôler l'exécution d'un while en Tk :
    - Des lignes provenant d'un fichier sont affichées à l'utilisateur,
    - Plutôt que de placer une tempo dans la boucle, je souhaite que l'utilisateur affiche ligne par ligne en cliquant sur le widget ET/OU en faisant un <Return>.
    - J'arrive à générer un évènement sur <Button-1> dans le widget mais pas à placer l'attente d'évènement dans le while.

    Dans le petit extrait ci-dessous :
    - Un <Return> (getc) sur la console permet de contrôler l'affichage ligne par ligne dans le widget, mais ce n'est pas pratique et pas du tout opérationnel si le widget est en plein écran.
    - Un clic sur <Button-1> sur le widget génère bien un évènement (print "Clic) sur la console, lorsque je mets le getc en commentaire...

    Je n'arrive pas à lier le tout, c'est à dire à placer une attente d'évènement dans le while qui contrôle le {next}
    Pouvez-vous m'aider, ça fait plusieurs jours que je sèche...
    MERCI d'avance !!!

    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
    #!/usr/local/bin/perl
    # Essai bind.pl
    use Tk;
    use strict;
     
    my $Wm = new MainWindow(
    	-title      => "Petit essais",
    );
     
    my $TextIn = $Wm->Scrolled("Text",
    	-height => 9,
    	-width => 20,
    	-scrollbars => "e",
    	-wrap => "word",
    	-background => "#ABFAA3",
    )->pack(-side => 'bottom', -pady => 5, -padx => 5, -fill => 'both', -expand => 0);
     
    my $Char = "";
     
    # association physique
    $Wm->bind('<ButtonRelease-1>' => \&Suite);
     
    Prog ();
     
    MainLoop;
     
    sub Prog {
    	$TextIn->delete("1.0", "end");
    	$TextIn->insert( "end", "TOTO\n" );
    	while(<DATA>){
    		$TextIn->insert( 'end', $_ );
    		$TextIn->update;
    		$TextIn->see('end');
    		print "$_\n";
    		$Char = getc;
    		# A la place du getc il faut une attente d'évènement sur <ButtonRelease-1> et/ou <Return>
    	}
    }
     
    sub Suite {
    	print ("Clic\n");
    	# A la place du print, il faut un {next} dans le while 	 
    }
     
    __DATA__
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pour lire un fichier comme tu le souhaites, tu n'es pas obligé d'utiliser while. Ainsi, tu peux lire une ligne à la demande de l'utilisateur. Voici un exemple de code :
    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
    #!/usr/local/bin/perl
    use Tk;
    use strict;
     
    my $Wm = new MainWindow( -title => "Petit essais", );
     
    my $TextIn = $Wm->Scrolled(
      "Text",
      -height     => 9,
      -width      => 20,
      -scrollbars => "e",
      -wrap       => "word",
      -background => "#ABFAA3",
    )->pack( -side => 'bottom', -pady => 5, -padx => 5, -fill => 'both', -expand => 1 );
     
    # association physique
    $Wm->bind( '<Return>' => \&LectureFichier );
     
    MainLoop;
     
    sub LectureFichier {
      my $data = <DATA>;
     
      if ($data) {
        chomp $data;
        $TextIn->insert( 'end', "$data\n" );
      }
      else {
        $TextIn->insert( 'end', "Fin du fichier atteint\n" );
      }
      $TextIn->update;
      $TextIn->see('end');
      return;
    }
     
    __DATA__
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4

  3. #3
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Encore et toujours MERCI djibril !
    Tu te doutes que c'est pour ajouter la fonction aux cours d'arabe...

    C'est SUPER !
    Pour avoir le déclenchement à la fois au <Return> et au <Button> je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # association physique
    $Wm->bind( '<Return>' => \&LectureFichier );
    $Wm->bind('<ButtonRelease-1>' => \&LectureFichier);
    Ca marche, mais y a-t-il plus propre ?

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    C'est déjà propre !

  5. #5
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    MERCI djibril !!!

  6. #6
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Dans mon programme réel (voir http://www.developpez.net/forums/d11...scrolled-text/ ), avec les boucles imbriquées il n'est pas facile de mettre en œuvre cette solution.

    J'ai trouvé une solution pour contrôler une boucle en Tk qui n'est pas très documentée avec tkwait, la voici :

    Association physique :
    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
    #!/usr/local/bin/perl
    # Essai bind.pl
    use Tk;
    use strict;
     
    my $Wm = new MainWindow(
    	-title      => "Physique",
    );
     
    my $TextIn = $Wm->Scrolled("Text",
    	-height => 9,
    	-width => 20,
    	-scrollbars => "e",
    	-wrap => "word",
    	-background => "#ABFAA3",
    )->pack(-side => 'bottom', -pady => 5, -padx => 5, -fill => 'both', -expand => 0);
     
    my $Char = "A";
     
    # association physique
    $Wm->bind('<ButtonRelease-1>' => \&Suite);
     
    Prog ();
     
    MainLoop;
     
    sub Prog {
    	$TextIn->delete("1.0", "end");
    	$TextIn->insert( "end", "TOTO\n" );
    	while(<DATA>){
    		$TextIn->insert( 'end', $_ );
    		$TextIn->update;
    		$TextIn->see('end');
    		$TextIn->tkwait('variable' => \$Char);
    	}
    }
     
    sub Suite {
    	if ($Char eq "A") {
    		$Char = "B";
    	}
    	else {
    		$Char = "A";
    	}
    }
     
    __DATA__
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4
    Association virtuelle :
    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
    53
    #!/usr/local/bin/perl
    # Essai bind.pl
    use Tk;
    use strict;
     
    my $Wm = new MainWindow(
    	-title      => "Virtuelle",
    );
     
    my $TextIn = $Wm->Scrolled("Text",
    	-height => 9,
    	-width => 20,
    	-scrollbars => "e",
    	-wrap => "word",
    	-background => "#ABFAA3",
    )->pack(-side => 'bottom', -pady => 5, -padx => 5, -fill => 'both', -expand => 0);
     
    my $Char = "A";
     
    # association virtuelle
    $TextIn->eventAdd( '<<virtual_clic1>>' => '<ButtonRelease-1>' ) ;
     
    Prog ();
     
    MainLoop;
     
    sub Prog {
    	$TextIn->delete("1.0", "end");
    	$TextIn->insert( "end", "TOTO\n" );
      $TextIn->bind( '<<virtual_clic1>>' => \&Suite ) ;
    	while(<DATA>){
    		$TextIn->insert( 'end', $_ );
    		$TextIn->update;
    		$TextIn->see('end');
    		$TextIn->tkwait('variable' => \$Char);
    	}
      $TextIn->eventDelete( '<<virtual_clic1>>' ) ;
    }
     
    sub Suite {
    	if ($Char eq "A") {
    		$Char = "B";
    	}
    	else {
    		$Char = "A";
    	}
    }
     
    __DATA__
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4
    Ce n'est pas super élégant mais ça fonctionne bien !
    J'ai opté pour les liaisons virtuelles, car dès que je sors de la boucle concernée, il est possible de faire un eventDelete de la liaison et ne pas avoir de comportements intempestifs sur clic de souris...
    Je mettrai à jour le programme cité dans le lien au plus tôt dans un édit sur le dernier post.

    Encore MERCI djibril,
    Je ne doute pas que tu aies mieux à nous proposer !
    Ne te prive pas, si tu as le temps, c'est un régal pour moi !

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

Discussions similaires

  1. Perl : Plusieurs arguments pour analyser une ligne
    Par blackj dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2006, 22h22
  2. Fonction pour contrôler la saisie des entiers
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/09/2006, 14h14
  3. [perl packager] package pour windows depuis linux
    Par doudweb dans le forum Modules
    Réponses: 1
    Dernier message: 10/09/2006, 22h54
  4. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45
  5. [perl] Caractères interdit pour la clé d'un hash ?
    Par LE NEINDRE dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 08h57

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