Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème en perltk.

2 réponses
Avatar
Henri FRASSETTI
Mon probl=E8me est conceptuel.
Je vous le soumets.
Je suis sous Linux. J'ai un script en PerlTk d'automatisation de t=E2che=
s, que je lance manuellement.
Il fonctionne bien.
Ce script appelle diff=E9rents modules qui eux m=EAme appellent d'autre m=
odules etc ... tout cela en PerlTk.
Et cela ouvre des fen=EAtres (qui ont le focus =E0 leur tour...)

Les diff=E9rents modules sortent des messages sur le STDOUT et le STDERR =
de mani=E8re tout =E0 fait correct et acceptable.

Jusque la pas de probl=E8me.

Je voudrais maintenant que ces messages de sortie s'affichent dans une pe=
tite fen=EAtre en PerlTk style fen=EAtre de console.
Mon probl=E8me actuel est que j'ex=E9cute un script en PerlTk 'ma console=
' qui ouvre une fen=EAtre celle-ci appelle mon gestionnaire=20
d'automatisme (ma console perd donc son focus) qui s'ex=E9cute avec honne=
ur et c'est seulement quand celui-ci se termine que mes=20
messages apparaissent sur la fen=EAtre console alors que je recherche un =
affichage "temps r=E9el" ou du moins au fils de l'eau.

Quelqu'un aurait une piste une id=E9e ?

D'avance merci.

2 réponses

Avatar
Sébastien Cottalorda
Mon problème est conceptuel.
Je vous le soumets.
Je suis sous Linux. J'ai un script en PerlTk d'automatisation de
tâches, que je lance manuellement.
Il fonctionne bien.
Ce script appelle différents modules qui eux même appellent d'autre
modules etc ... tout cela en PerlTk.
Et cela ouvre des fenêtres (qui ont le focus à leur tour...)

Les différents modules sortent des messages sur le STDOUT et le STDERR
de manière tout à fait correct et acceptable.

Jusque la pas de problème.

Je voudrais maintenant que ces messages de sortie s'affichent dans une
petite fenêtre en PerlTk style fenêtre de console.
Mon problème actuel est que j'exécute un script en PerlTk 'ma console'
qui ouvre une fenêtre celle-ci appelle mon gestionnaire d'automatisme
(ma console perd donc son focus) qui s'exécute avec honneur et c'est
seulement quand celui-ci se termine que mes messages apparaissent sur la
fenêtre console alors que je recherche un affichage "temps réel" ou du
moins au fils de l'eau.

Quelqu'un aurait une piste une idée ?


Salut,

J'ai déjà rencontré ce problème.
Il y a deux solutions:
- Si ta console ne fait rien d'autre qu'afficher le fil de l'eau, il
existe un module Tk::ExecuteCommand qui sait faire cela très bien.

- Dans le cas contraire, :
* tu peux faire du genre:
=================================================================== #!/usr/bin/perl -w
use strict;
use Tk;

my $FIC;
open ($FIC, "/usr/bin/tail -f /var/log/messages |") or die "$!";
my $mw=MainWindow->new();
my $texte=$mw->Scrolled("Text",
-width => 80,
-height => 25,
)->pack(-expand=>1);
$mw->fileevent($FIC, 'readable', [&inserer_texte]);
MainLoop();

sub inserer_texte {
my $ligne_courante;
if ($ligne_courante=<$FIC>){
$texte->insert ('end', $ligne_courante);
$texte->yview('moveto', 100);
}
else {
$mw->fileevent($FIC, 'readable', "");
}
}
===================================================================
* En dernier recours inspire toi du module précédemment cité qui fait ....
=================================================================== sub _read_stdout {
# Called when input is available for the output window. Also checks
# to see if the user has clicked Cancel.
my($self) = @_;
if ($self->{-finish}) {
$self->kill_command;
}
else {
my $h = $self->{-handle};
die "ExecuteCommand handle is udefined!n" unless defined $h;
my $stat;
if ( $stat = sysread $h, $_, 4096 ) { # LECTURE
my $t = $self->Subwidget('text');
$t->insert('end', $_); # INSERTION DANS WIDGET
$t->yview('end'); # DEPLACEMENT DU 'VISUEL'
}
elsif ( $stat == 0 ) {
$self->{-finish} = 1;
}
else {
die "ExecuteCommand sysread error: $!";
}
}
}
==================================================================== J'espère que cela t'aidera.

Sébastien

Avatar
Henri FRASSETTI
Merci pour tout cela

Je vais faire des essais.

Mon problème est conceptuel.
Je vous le soumets.
Je suis sous Linux. J'ai un script en PerlTk d'automatisation de
tâches, que je lance manuellement.
Il fonctionne bien.
Ce script appelle différents modules qui eux même appellent d'autr e
modules etc ... tout cela en PerlTk.
Et cela ouvre des fenêtres (qui ont le focus à leur tour...)

Les différents modules sortent des messages sur le STDOUT et le STDE RR
de manière tout à fait correct et acceptable.

Jusque la pas de problème.

Je voudrais maintenant que ces messages de sortie s'affichent dans une
petite fenêtre en PerlTk style fenêtre de console.
Mon problème actuel est que j'exécute un script en PerlTk 'ma cons ole'
qui ouvre une fenêtre celle-ci appelle mon gestionnaire d'automatism e
(ma console perd donc son focus) qui s'exécute avec honneur et c'est
seulement quand celui-ci se termine que mes messages apparaissent sur
la fenêtre console alors que je recherche un affichage "temps réel " ou
du moins au fils de l'eau.

Quelqu'un aurait une piste une idée ?


Salut,

J'ai déjà rencontré ce problème.
Il y a deux solutions:
- Si ta console ne fait rien d'autre qu'afficher le fil de l'eau, i l
existe un module Tk::ExecuteCommand qui sait faire cela très bien.

- Dans le cas contraire, :
* tu peux faire du genre:
======================== ========================= ===================
#!/usr/bin/perl -w
use strict;
use Tk;

my $FIC;
open ($FIC, "/usr/bin/tail -f /var/log/messages |") or die "$!";
my $mw=MainWindow->new();
my $texte=$mw->Scrolled("Text",
-width => 80,
-height => 25,
)->pack(-expand=>1);
$mw->fileevent($FIC, 'readable', [&inserer_texte]);
MainLoop();

sub inserer_texte {
my $ligne_courante;
if ($ligne_courante=<$FIC>){
$texte->insert ('end', $ligne_courante);
$texte->yview('moveto', 100);
}
else {
$mw->fileevent($FIC, 'readable', "");
}
}
======================== ========================= ===================

* En dernier recours inspire toi du module précédemment cit é qui
fait ....
======================== ========================= ===================
sub _read_stdout {
# Called when input is available for the output window. Also check s
# to see if the user has clicked Cancel.
my($self) = @_;
if ($self->{-finish}) {
$self->kill_command;
}
else {
my $h = $self->{-handle};
die "ExecuteCommand handle is udefined!n" unless defined $h;
my $stat;
if ( $stat = sysread $h, $_, 4096 ) { # LECTURE
my $t = $self->Subwidget('text');
$t->insert('end', $_); # INSERTION DANS WIDGET
$t->yview('end'); # DEPLACEMENT DU 'VISUEL '
}
elsif ( $stat == 0 ) {
$self->{-finish} = 1;
}
else {
die "ExecuteCommand sysread error: $!";
}
}
}
======================== ========================= ====================
J'espère que cela t'aidera.

Sébastien