Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Interfaces Graphiques
Interfaces Graphiques Forum d'entraide pour les interfaces graphiques en Perl (TK, GTK, Tk-Zinc, 2D et 3D avec OpenGPL, ....). Avant de poster, veuillez consulter la FAQ Perl/Tk , les cours Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/01/2012, 08h18   #1
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
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 :
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
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 10h00   #2
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
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 :
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
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 10h25   #3
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
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 :
1
2
3
# association physique
$Wm->bind( '<Return>' => \&LectureFichier );
$Wm->bind('<ButtonRelease-1>' => \&LectureFichier);
Ca marche, mais y a-t-il plus propre ?
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 12h16   #4
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
C'est déjà propre !
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 16h58   #5
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
MERCI djibril !!!
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 16h25   #6
dmganges
Membre confirmé
 
Avatar de dmganges
 
Homme Michel DUFOUR
Administrateur Unix / Oracle retraité
Inscription : septembre 2011
Messages : 209
Détails du profil
Informations personnelles :
Nom : Homme Michel DUFOUR
Âge : 60
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Administrateur Unix / Oracle retraité
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 209
Points : 223
Points : 223
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 :
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 :
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 !
dmganges est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h36.


 
 
 
 
Partenaires

Hébergement Web