OVH Cloud OVH Cloud

Module Tk::Text et sauvegarde du texte ecrit...

2 réponses
Avatar
Patrice Karatchentzeff
Salut,

J'ai un problème bizarre et je ne comprends pas trop pourquoi...

J'ai besoin d'utiliser le Tk::Text de Perl/Tk pour que l'utilisateur
écrivent quelques phrases. Je ne peux réduire cela au module Entry car
l'utilisateur peut écrire son baratin sur plusieurs lignes.

Or, je n'arrive pas à enregistrer la prose de l'utilisateur. Voici
l'exemple réduit à sa plus simple expression :

#!/usr/bin/perl -w

use strict;
use Tk;
use Tk::Text;

my $top = MainWindow -> new;
my $main = $top -> Frame();
$main -> pack(-fill => 'both', -expand => 'yes');

my $rapport;
my $text = $main -> Scrolled
(
"Text",
-scrollbars => "osoe",
-exportselection => 'yes',
-relief => 'sunken',
-height => "12",
);
$text -> pack(-expand => 'yes', -fill=> 'both');

# voilà où cela coince
#
$rapport = $text -> get("1.0", "end");
print "$rapport";

MainLoop;

La seule chose qu'affiche ce programme est quelques "\n" sur la sortie
standard mais rien d'autre...

Dans _Introduction à Perl/Tk_, il y a pourtant un programme qui fait
sensiblement la même chose (un éditeur simplifié) mais
l'enregistrement se fait via une fonction appelée par un bouton. Il y a
alors peut-être rupture de la boucle d'événement mais je ne vois pas
trop...

J'ai bien essayé plein de trucs (sortie de la boucle d'événement,
etc.) mais rien n'y fait...

Quelqu'un connait-il la solution ? Ou bien carrément une autre voie...

Merci d'avance,

PK

--
      |\      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:p.karatchentzeff@free.fr
     |,4-  ) )-,_. ,\ (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'\_)       

2 réponses

Avatar
jl_morel
Dans l'article , p.
a dit...

J'ai un problème bizarre et je ne comprends pas trop pourquoi...

J'ai besoin d'utiliser le Tk::Text de Perl/Tk pour que l'utilisateur
écrivent quelques phrases. Je ne peux réduire cela au module Entry car
l'utilisateur peut écrire son baratin sur plusieurs lignes.

Or, je n'arrive pas à enregistrer la prose de l'utilisateur. Voici
l'exemple réduit à sa plus simple expression :

[couic]


La seule chose qu'affiche ce programme est quelques "n" sur la sortie
standard mais rien d'autre...



Ça ne marche pas, car la ligne $rapport = $text -> get("1.0", "end"); est
avant MainLoop donc le widget $text n'est pas encore rempli par
l'utilisateur.

Ça ne marche pas non plus si vous mettez cette ligne après MainLoop, car,
quand elle est exécutée, les fenêtres ont été fermées et la mémoire libérée.

Il faut sauvegarder le contenu du widget text juste quand l'utilisateur
ferme la fenêtre, en utilisant :

$top->protocol('WM_DELETE_WINDOW' => &routine);

Voilà ce que ça donne avec une routine anonyme :
(ne pas oublier $top->destroy; à la fin de la routine, sinon la fenêtre ne
peut plus être fermée)

#!/usr/bin/perl -w
use strict;
use Tk;
use Tk::Text;

my $top = MainWindow->new;
my $main = $top->Frame();
$main -> pack(-fill => 'both', -expand => 'yes');

my $rapport;
my $text = $main->Scrolled(
"Text",
-scrollbars => "osoe",
-exportselection => 'yes',
-relief => 'sunken',
-height => "12",
);
$text->pack(-expand => 'yes', -fill=> 'both');

$top->protocol('WM_DELETE_WINDOW' => sub {$rapport=$text->get("1.0", "end");
$top->destroy;
});

MainLoop;

print "$rapport";

__END__


--
J-L.M.

Avatar
Patrice Karatchentzeff
(Jean-Louis MOREL) writes:

[...]

Ça ne marche pas, car la ligne $rapport = $text -> get("1.0", "end"); est
avant MainLoop donc le widget $text n'est pas encore rempli par
l'utilisateur.

Ça ne marche pas non plus si vous mettez cette ligne après MainLoop, car,
quand elle est exécutée, les fenêtres ont été fermées et la mémoire libérée.


Merci pour l'explication : c'est que « j'intuitais »...


Il faut sauvegarder le contenu du widget text juste quand l'utilisateur
ferme la fenêtre, en utilisant :

$top->protocol('WM_DELETE_WINDOW' => &routine);


Merci : cela fonctionne parfaitement... Par contre, cela oblige de
fermer la fenêtre pour obtenir ce résultat : je suppose que l'on peut
aussi le faire en changer un autre événement X...

Une question : je n'ai jamais vu cela dans la doc... c'est quoi ce
protocol ? Ou plutôt, où est-ce documenté ?

Merci beaucoup en tout cas... J'ai cru un instant devoir changer de
boîte à outils ;-)

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)