Perl / Tk menubar причуды - PullRequest
       33

Perl / Tk menubar причуды

0 голосов
/ 10 мая 2011

Я пытаюсь добавить строку меню со стандартными опциями File Open, Save и New. Однако вместо того, чтобы вести себя как ожидалось, при создании кадра запускается подпрограмма, обрабатывающая действия 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";
    }
}

1 Ответ

2 голосов
/ 10 мая 2011

Это потому, что &menu_file('n') является синтаксисом для , вызывающим подпрограмму ( подробнее ). Вместо этого вы должны сделать это так:

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

Или вот так:

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