Как включить отключенный пункт контекстного меню, когда выбор происходит в графическом интерфейсе Perl Tk?
Например, в следующем скрипте:
use Tk;
my $mw = new MainWindow;
my $t = $mw->Scrolled("Text")->pack;
my $popup = $mw->Menu(
-menuitems => [
[
Button => 'Copy Selected',
-state => "disabled",
-command => sub {$t->clipboardColumnCopy}
],
]
);
$t->menu($popup);
MainLoop;
Как узнать, когда происходит выбор, чтобы я мог использовать следующий код
$popup->entryconfigure(1, -state=>'normal');
изменить состояние пункта меню?
ОБНОВИТЬ:
Большое спасибо @Chas и @gbacon:)
Я думаю, что, может быть, я смогу объединить два хороших ответа
$t->bind(
"<Button1-ButtonRelease>",
sub {
local $@;
my $state = defined eval { $t->SelectionGet } ?
"normal" : "disable";
$popup->entryconfigure(1, -state => $state)
}
);
2 ответа
Решение
Я не знаю Tk
очень хорошо, но это ответ (но, возможно, не правильный ответ):
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
my $mw = new MainWindow;
my $t = $mw->Text->pack;
my $popup = $mw->Menu(
-menuitems => [
[ Button => 'Copy Selected', -state => "disabled", -command => sub {$t->clipboardColumnCopy} ],
]
);
$t->menu($popup);
$t->bind(
"<Button1-ButtonRelease>",
sub {
my $text = $t->getSelected;
if (length $text) {
$popup->entryconfigure(1, -state => 'normal');
} else {
$popup->entryconfigure(1, -state => 'disabled');
}
}
);
MainLoop;
Несколько изменений приводят к желаемому поведению. Код ниже часы <ButtonPress-1>
который может отменить выбор и, если это так, отключить функцию копирования выбранного. За <ButtonPress-3>
, он включает пункт меню, если есть выбор.
my $copySelectedLabel = "Copy Selected";
my $popup = $mw->Menu(
-menuitems => [
[
Button => $copySelectedLabel,
-state => "disabled",
-command => sub {$t->clipboardColumnCopy}
],
]
);
sub maybeEnableCopySelected {
local $@;
$popup->entryconfigure($copySelectedLabel, -state => "normal")
if defined eval { $t->SelectionGet };
}
sub maybeDisableCopySelected {
local $@;
$popup->entryconfigure($copySelectedLabel, -state => "disabled")
unless defined eval { $t->SelectionGet };
}
$t->bind('<ButtonPress-1>' => \&maybeDisableCopySelected);
$t->bind('<ButtonPress-3>' => \&maybeEnableCopySelected);
$t->menu($popup);