0

標準の[ファイルを開く]、[保存]、[新規]オプションを使用してメニューバーを追加しようとしています。ただし、フレームの作成時に、期待どおりに動作する代わりに、open、save、およびnewアクションを処理するサブルーチンが起動されます。しかし、実際にクリックすると、そうではありません。

以下は私が使用しているコードです。(メインウィンドウにはメニューバーのみが含まれます)

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

1 に答える 1

2

これは、サブルーチンを呼び出す&menu_file('n')ための構文であるためです(詳細)。代わりに、次のようにする必要があります。

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

またはこのように:

$mw->bind('<Control-n>' => [\&menu_file, 'n']);
于 2011-05-10T12:21:28.337 に答える