2011-05-10 1 views
0

표준 파일 열기, 저장 및 새로 만들기 옵션이있는 메뉴 모음을 추가하려고합니다. 그러나 예상대로 동작하는 대신 프레임을 만들 때 열기, 저장 및 새 작업을 처리하는 서브 루틴이 시작됩니다. 그러나 실제로 클릭 할 때 그렇지 않습니다.Perl/Tk 메뉴 모음의 단점

다음 코드는 제가 사용하고있는 코드입니다. (메인 창은 도구 모음을 포함)

#!/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"; 
    } 
} 

답변

2

&menu_file('n')이 서브 루틴 (more details)를 호출 구문이기 때문이다 그. 대신, 당신은 이런 식으로 할 필요가 :

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

또는 같은

:

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

덕분으로 두 가지 형태가 미묘하게 다르다는 것을 광고 : – kshenoy

+1

참고 작동합니다. 이에 대한 설명은이 [관련 질문에 대한 답변] (http://stackoverflow.com/questions/2620461#2622318)을 참조하십시오. –