2011-05-10 3 views
0

J'essaie d'ajouter une barre de menus avec les options standard Ouvrir un fichier, Enregistrer et Nouveau. Cependant, au lieu de se comporter comme prévu, la sous-routine gérant les actions open, save et new est lancée lors de la création de la trame. Mais, quand je clique sur eux, ce n'est pas le cas.Perl/Tk bizarreries

Voici le code que j'utilise. (Fenêtre principale ne contient que la barre de menus)

#!/usr/bin/perl 

use strict; 
use warnings; 
use diagnostics; 
use Data::Dumper; 

use Tk 8.0; 
use Tk::NoteBook; 
use Tk::MsgBox; 



my $mw=MainWindow->new; 
$mw->geometry("+500+300"); 

# Menu Bar Buttons 
my $mbar=$mw->Menu(); 
$mw->configure(-menu => $mbar); 
    my $file=$mbar->cascade(-label=>"~File", -tearoff => 0); 
    my $help=$mbar->cascade(-label =>"~Help", -tearoff => 0); 
# File Menu 
    $file->command(-label =>'~New  ', -command=>&menu_file('n'), -accelerator=>'Ctrl+N'); 
    $file->command(-label =>'~Open ', -command=>&menu_file('o'), -accelerator=>'Ctrl+O'); 
    $file->command(-label =>'~Save ', -command=>&menu_file('s'), -accelerator=>'Ctrl+S'); 
    $file->separator(); 
    $file->command(-label =>'~Quit ', -command=>sub{exit}, -accelerator=>'Ctrl+Q'); 
# Help Menu 
    $help->command(-label => 'Version'); 
    $help->separator; 
    $help->command(-label => 'About'); 

# Menu Bar Accelerators 
    $mw->bind('<Control-n>', &menu_file('n')); 
    $mw->bind('<Control-o>', &menu_file('o')); 
    $mw->bind('<Control-s>', &menu_file('s')); 
    $mw->bind('<Control-q>', sub{exit}); 


MainLoop; 



sub menu_file { 
    my $opt=shift; 

    my $filetypes = [ 
     ['Codac files', '.k'], 
     ['All Files', '*' ], 
    ]; 

    if($opt eq 's'){ 
     my $txt_ent_script = $mw->getSaveFile(-filetypes=>$filetypes, -initialfile=>'jitter', -defaultextension=>'.k'); 
     print "Output filename: $txt_ent_script\n"; 
    } 
} 

Répondre

2

C'est parce que &menu_file('n') est la syntaxe pour appeler un sous-programme (more details). Au lieu de cela, vous devez le faire comme ceci:

$mw->bind('<Control-n>' => sub{menu_file('n')}); 

Ou comme ceci:

$mw->bind('<Control-n>' => [\&menu_file, 'n']); 
+0

Merci, fonctionne comme annoncé :) – kshenoy

+1

Notez que les deux formes sont subtilement différentes. Voir ceci [réponse à une question connexe] (http://stackoverflow.com/questions/2620461#2622318) pour une explication. –