Perl/Tk Tutoriel - Création d'un
GUI (Interface Utilisateur Graphique) avec le module Tk de
Perl
Button, Entry, Label
Widgets 1 : Button, Entry, Label
Un widget est un objet d'interface utilisateur sur des interfaces
graphiques X. Confus? Retenez juste que c'est le nom de
l'objet qui apparaît à l'écran.
Il existe de nombreux types de widgets.
Si vous souhaitez afficher un bouton, vous utilisez
le widget bouton (button).
Pour le texte, vous utilisez le widget text.
Pour l'entrée,
vous l'avez deviné, le widget de saisie (entry). Synthaxe: my $WidgetVariable = $Window -> WidgetType(?Option 1=>Value
1,
?Option 2=>Value 2 ...??) -> pack();
Trois
choses doivent être dites à propos des widgets.
Le premier concerne la
variable widget. C'est ce que j'ai expliqué
plus tôt. La variable
widget doit être unique parmi tous les autres widgets et
sera utilisée chaque
fois que ce widget doit être consulté.
La seconde concerne les options. Chaque
widget dispose de quelques options qui peuvent être
utilisés pour le
configurer. Cela se fait généralement lorsque le widget
est déclarée,
mais il peut être fait par la suite aussi.
La dernière chose concerne
les commandes. Chaque widget dispose de commandes qui
peut aussi être
utilisé pour le configurer ou lui faire faire quelque chose.
Mais
avant de commencer, nous avons besoin d'en savoir un peu sur la
commande pack. Je l'ai expliqué plus tôt,
mais le redit juste une fois
de plus afin que vous n'ayez pas à appuyer sur le bouton back.
Pack est
un gestionnaire d'espace (géométrique). grid est un autre gestionnaire de
géométrie nous le verrons plus tard. Pack est beaucoup
plus
simple que grid.
La ligne: $Bonjour -> pack;
dit à l'interprèteur d'emballer(pack) le widget
appelé "$bonjour".
Cela
fera un bouton. Il peut être configuré pour
exécuter du code lorsque le
bouton est enfoncé. Ceci habituellement ce
référera à une fonction
alors quand le bouton est enfoncé, la fonction sera
exécutée. Un bouton (button)
est indiqué ci-dessous. Ce bouton est créé en
utilisant la balise HTML
d'entrée.
Quelques Options
-text=>"TEXT"
TEXT will be the text displayed on the button
-command=>CALLBACK
CALLBACK will be the code that is called when the button is
pushed
#Ceci est exécuté quand le bouton est pressé sub push_button { ... peut importe ... }
Vous
avez peut-être remarqué que j'ai utilisé un slash (une barre
oblique) (\) dans le rappel
de commande (-command =>\&push_button);).
Assurez-vous que le slash est bien là - pour voir pourquoi,
allez dans les
erreurs les plus
communes par Perl/Tk débutants.
Une
entry est un widget qui affiche une chaîne de texte
d'une ligne et permet
à l'utilisateur de saisir et modifier du texte dedans. Quand une
entry a le focus de saisie il affiche un curseur d'insertion pour
indiquer
où de nouveaux caractères seront insérés.
Un élément d'entry est
démontrée en utilisant HTML.
Quelques Options
-width=>NUMBER
Width (largeur) du champ de saisie. NUMBER devra être
un nombre entier (integer).
-textvariable=>\$VARIABLE
Le contenu de la variable VARIABLE sera affiché dans
le widget. Si dans le widget le texte est édité, la
variable sera automatiquement édité.
-state=>STATE
L'état du champ de saisie. Il peut être normal,
disabled, ou readonly. Si il
est readonly le texte ne peut être
édité.
Quelque Commandes
Synthaxe
Déscription
Exemple
$widget -> get();
le texte dans le champ de saisie peut être pris par
cette commande
$name = $ent -> get();
$widget -> delete(FIRST?,LAST?);
Efface un ou plusieurs élements de entry. FIRST est
l'indice du premier caractère à effacer, et LAST est
l'indice
du caractère juste après le dernier à supprimer.
Si last n'est pas
spécifié il prend par défaut pour FIRST+1, i.e.
soit un seul caractère est
supprimé. Cette commande retourne une chaîne vide.
$ent -> delete(0,'end');
$widget -> insert(index,"STRING");
Insérer
les caractères de la chaîne juste avant le
caractère indiqué par index.
Indice est 0 pour le premier caractère. Le mot «end»
peut être utilisé
pour le dernier caractère
$ent -> insert('end',"Hello");
Exemple
#!/usr/local/bin/perl use Tk;
# Main Window my $mw = new MainWindow;
#GUI Building Area my $ent = $mw -> Entry() -> pack(); my $but = $mw -> Button(-text => "Push Me", -command =>\&push_button); $but -> pack();
MainLoop;
#This is executed when the button is pressed sub push_button { $ent -> insert('end',"Hello"); }
Spécifie
la police à utiliser lors de l'élaboration du texte
à l'intérieur du
widget. Vous pouvez n'indiquer que la police ou vous pouvez lui donner
dans ce format "FONTNAME SIZE STYLE "(Taille Style). Le style peut
être gras, normale etc.
L'exemple
ci-dessus avec la fonction push_button ne montre pas le texte
"whatever". Aussi, si j'utilise la commande use strict,
comment puis-je écrire le texte whatever
Non
- vous m'avez mal compris. Que "whatever" n'est pas le résultat
de sortie - je
voulais vous pouvez mettre le code que vous voulez à la place.
Avec le
recul, je crois que je l'ai commenté.
Anonymous
at 31 Jul, 2007 04:31 Je pense que la fonction body(sub) doit être écrit
à
l'intérieur de MainLoop elle-même. J'ai eu
récemment la même question et
je crois que la réponse est cette déscription.
La bonne façon pour faire ça
est... my $button = $wm-> Button(-text => "Push Me", -command
=>\&push_button, -state=>"normal");
Plus loin $button->configure(-state=>'disabled');
Quand je lance une application simple en
Perl/TK comme Hello World en double-cliquant dessus sous Windows XP,
une console s'ouvre également avec la fenêtre Hello World.
Comment éviter ou masquer la fenêtre de commande
d'apparaître à l'écran
Vous
avez écrit un programme Perl pour le port Windows de Perl et Tk,
mais
vous obtenez une fenêtre shell DOS à chaque fois que vous
démarrez
votre programme.
Ajouter ceci au début de votre programme:
BEGIN {
if ($^O eq 'MSWin32') {
require Win32::Console;
Win32::Console::Free( );
}
}
Le module Win32:: Console vous permet de contrôler la
fenêtre du terminal
qui a lancé votre programme. Tout ce que vous devez faire est de
fermer
cette fenêtre (ou la libéré dans le langage
étrange de
l'API Windows) et voila pas de fenêtre embêtante shell DOS.
La documentation du module Console Win32:: , qui est inclus
avec les distributions de Perl destiné pour le système
Microsoft
Pouvez-vous
s'il vous plaît me dire comment puis-je supprimer ou rendre
le scrolledlistbox invisible dans la fenêtre principale?
Je développe 1 application en Tk(VTcl)
Salut Binny,
J'ai une sub mainp(),qui
tourne en boucle et peut prendre moins d'une seconde ou quelques
minutes. Parfois, je veux sortir du programme avant que mainp () se
termine. J'ai le code suivant. S'il vous plaît pourriez-vous me
suggérer comment y parvenir?
J'essaie
de créer et de supprimer les widgets label et entry
dynamiquement. Je suis en mesure de créer des widgets mais
incapable de
supprimer la plage spécifiée de widgets.
Je utilise le gestionnaire gird. Pourriez-vous s'il vous plaît
aidez-moi pour les mêmes?
Anonymous
at 12 Jun, 2008 09:11 Si vous exécutez le script perl avec wperl.exe au lieu de
perl, pas de
console de commande sera affiché. Si vous modifiez les actions
pour le
type .pl vous pouvez faire un lancement avec wperl.
Anonymous
at 02 Aug, 2008 06:41 Salut
Est-il possible de faire sur le bouton comme bouton Lien hypertexte
sens que lorsque je clique sur ce bouton page web ouverte?
Je peux l'insérer dans la sous procedure une partie du code pour
ouvrir une
application (pour ex.iexplore), mais cela dépendra de la voie de
l'application. Y at-il moyen d'obtenir le widget bouton pour ouvrir le
navigateur web par défaut pour n'importe quelle configuration
personnalisée?
Le paramètre d'entrée ne serait url de la page Web. merci
Cher Monsieur,
Si je me tourne overrideredirect à 1, alors je ne peux pas
mettre key-in sur la plage d'entry.
Toutes les key-in apparaîtrons sur la fenêtre de la console
cmdtool.
Pourriez-vous m'aider à revoir ce code, si je fais une erreur
pour la syntaxe??
Merci donc bouillie pour votre instruction.
S'il vous plaît trouver ci-joint le code test: (sur le
système Solaris, Sun Blade-100 ordinateurs)
my $tton = $fileSelectFrame->Button(
-relief => "groove",
-text => "deletess ",
-command => sub {$list -> delete ("0","end");})->pack();
I have a frame which consits of buttons that are created dynamically
but whilst trying to use a button to delete the contents of this frame
an error: Failed to Autoload Tk::Widget::delete The $list refers to the
frame
I am using a perl program for accessing MySQL
database. The program doing some process on the retrieved data.I want
to implement GUI or some web based screen for this. I need to display
results of the program in textboxes and textarea. Please give me an
idea about how to pass the result of the perl program to textbox or
textarea.
Comment
S'il vous plait n'entrez pas vos commentaires sous cette forme - il
s'agit de fausse forme confondant le spamming bots. Le formulaire
suivant est le
réel.
Formatage de Commentaire: balises HTML a, strong, em, b, i,
code,
pre, p et br admis. D'autres balises seront
affichés sous forme de code
(<deviendrons <). Urls, sauts de ligne, serons
auto-formaté.
Comments
Je pense que la fonction body(sub) doit être écrit à l'intérieur de MainLoop elle-même. J'ai eu récemment la même question et je crois que la réponse est cette déscription.
my $lab = $mw -> Label(-text=>"Enter name:") -> pack();
$lab->destroy();
Ce qui suit, ne marche pas pour moi.
my $Enable_button="disable";
......
$mw->-> Button(-text => "Push Me",
-command =>\&push_button);
-state => $Enable_button,
or
-state => \$Enable_button,
$but -> pack();
.......
then, later
$Enable_button = "normal";
my $button = $wm-> Button(-text => "Push Me", -command =>\&push_button, -state=>"normal");
Plus loin
$button->configure(-state=>'disabled');
Ca le fait. Merci pour votre aide
une console s'ouvre également avec la fenêtre Hello World.
Comment éviter ou masquer la fenêtre de commande d'apparaître à l'écran
Merci d'avance,
Sibu.N.L
The windows console pops up by immediatly.
Ajouter ceci au début de votre programme:
BEGIN {
if ($^O eq 'MSWin32') {
require Win32::Console;
Win32::Console::Free( );
}
}
Le module Win32:: Console vous permet de contrôler la fenêtre du terminal qui a lancé votre programme. Tout ce que vous devez faire est de fermer cette fenêtre (ou la libéré dans le langage étrange de l'API Windows) et voila pas de fenêtre embêtante shell DOS.
La documentation du module Console Win32:: , qui est inclus avec les distributions de Perl destiné pour le système Microsoft
J'ai essayé et ça a marché.
Sorry, Je suis trop loin pour voir cette reponse.
Sibu.
Text widget
.Je développe 1 application en Tk(VTcl)
J'ai une sub mainp(),qui tourne en boucle et peut prendre moins d'une seconde ou quelques minutes. Parfois, je veux sortir du programme avant que mainp () se termine. J'ai le code suivant. S'il vous plaît pourriez-vous me suggérer comment y parvenir?
my $print = $right1->Button(-text => 'Build Index',
-command => \&mainp)->
grid(qw/-row 7 -column 1 -sticky se/);
my $exit = $right1->Button(-text => ' Exit ',
-command => [$mw => 'destroy'])->
grid(qw/-row 7 -column 2 -sticky sw/);
Je utilise le gestionnaire gird. Pourriez-vous s'il vous plaît aidez-moi pour les mêmes?
Si vous exécutez le script perl avec wperl.exe au lieu de perl, pas de console de commande sera affiché. Si vous modifiez les actions pour le type .pl vous pouvez faire un lancement avec wperl.
Salut
Est-il possible de faire sur le bouton comme bouton Lien hypertexte sens que lorsque je clique sur ce bouton page web ouverte?
Je peux l'insérer dans la sous procedure une partie du code pour ouvrir une application (pour ex.iexplore), mais cela dépendra de la voie de l'application. Y at-il moyen d'obtenir le widget bouton pour ouvrir le navigateur web par défaut pour n'importe quelle configuration personnalisée? Le paramètre d'entrée ne serait url de la page Web.
merci
Si je me tourne overrideredirect à 1, alors je ne peux pas mettre key-in sur la plage d'entry.
Toutes les key-in apparaîtrons sur la fenêtre de la console cmdtool.
Pourriez-vous m'aider à revoir ce code, si je fais une erreur pour la syntaxe??
Merci donc bouillie pour votre instruction.
S'il vous plaît trouver ci-joint le code test: (sur le système Solaris, Sun Blade-100 ordinateurs)
use Tk;
$main = MainWindow->new;
$main->overrideredirect(1);
$frm1 = $main->Frame ( -relief => 'groove')
->pack( -side => 'top', -fill => 'both');
$lb1 = $frm1->Label ( -bg => 'white')
->pack( -side => 'left' );
$en1 = $frm1->Entry ( -relief => 'sunken', -width => 16 )
->pack( -side => 'left');
MainLoop;
-relief => "groove",
-text => "deletess ",
-command => sub {$list -> delete ("0","end");})->pack();
I have a frame which consits of buttons that are created dynamically but whilst trying to use a button to delete the contents of this frame an error: Failed to Autoload Tk::Widget::delete The $list refers to the frame
how to return the output of a subprogram to a textbox?
S'il vous plait n'entrez pas vos commentaires sous cette forme - il s'agit de fausse forme confondant le spamming bots. Le formulaire suivant est le réel.
Formatage de Commentaire: balises HTML
a, strong, em, b, i, code, pre, p
etbr
admis. D'autres balises seront affichés sous forme de code (<deviendrons <). Urls, sauts de ligne, serons auto-formaté.