En utilisant Perl Tkx, je veux obtenir des informations de l'utilisateur, fermer la fenêtre et peut-être le faire plus tard. Pour l'entrée de l'utilisateur, je montre juste quelques boutons, et l'utilisateur peut cliquer sur l'un d'entre eux. Voici ce que j'ai maintenant:Comment puis-je inviter l'utilisateur à plusieurs reprises avec Tkx?
sub prompt_user {
my $answer;
my $mw = Tkx::widget->new("."); ## the main window is unavailable the second time
$mw->g_wm_title("Window Title"); ## line 40
$mw->g_wm_minsize(300, 200);
my $label = $mw->new_label(-text => "Question to the user?");
$label->g_pack(-padx => 10, -pady => 10);
my $button1 = $mw->new_button(
-text => "Option One",
-command => sub { $answer = 0; $mw->g_destroy; },
);
$button1->g_pack(-padx => 10, -pady => 10);
my $button2 = $mw->new_button(
-text => "Option Two",
-command => sub { $answer = 1; $mw->g_destroy; },
);
$button2->g_pack(-padx => 10, -pady => 10);
Tkx::MainLoop(); ## This blocks until the main window is killed
return $answer;
}
Ainsi l'utilisateur clique sur l'un des boutons, la fenêtre se ferme, prompt_user() renvoie 0 ou 1 (en fonction du bouton l'utilisateur a cliqué) et l'exécution se poursuit. Jusqu'à ce que j'essaie d'inviter à nouveau l'utilisateur. Puis-je obtenir une erreur:
can't invoke "wm" command: application has been destroyed at MyFile.pm line 40
Je veux juste une façon de mettre en place un tas de boutons, laissez l'utilisateur clique, attendez de voir que l'on est cliqué, et peut-être le faire plus tard. Y at-il un moyen que je peux attendre une réponse au bouton clic sans détruire la fenêtre principale? Peut-être créer une sous-fenêtre? Je n'utilise pas Tkx depuis longtemps, et googling montre beaucoup d'exemples simples comme le code ci-dessus (en utilisant MainLoop/g_destroy), mais je n'ai trouvé aucun exemple de recréation de fenêtres. J'ai vu des choses sur une boîte de dialogue ou une boîte de message, mais celles-ci ne me conviennent pas. Je veux mettre du texte sur les boutons, et utiliser un nombre arbitraire de boutons (donc je ne veux pas être limité à oui/non/annuler, et seulement 3 options).
Mise à jour Voici ce que j'ai pu utiliser
# hide the main window, since I'm not using it
my $mw = Tkx::widget->new(".");
$mw->g_wm_withdraw();
# function to prompt the user to answer a question
# displays an arbitrary number of answers, each on its own button
sub prompt {
my $prompt = shift;
my $list_of_answers = shift;
# Note: the window name doesn't matter, as long as it's './something'
my $answer = Tkx::tk___dialog("./mywindowpath", # window name
"Prompt", # window title
$prompt, # text to display
undef, # tk bmp library icon
undef, # default button
@$list_of_answers); # list of strings to use as buttons
return $answer;
}
# use the button to ask a question
my $index = prompt("Who was the best captain?",
[ "Kirk", "Picard", "Cisco", "Janeway", "Archer" ]);
Ajout de l'étiquette tk pour obtenir une meilleure réponse. – slebetman
Essayez-vous d'écrire un programme de ligne de commande (c'est-à-dire sans interface graphique) qui affiche parfois des éléments de l'interface graphique?C'est possible, mais maladroit. –
@Michael - oui, c'est exactement ce que j'essaie de faire. Oui, cela semble difficile à faire. – Tim