Как включить отключенный пункт контекстного меню, когда выбор происходит в графическом интерфейсе 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);