Как очистить текст в записи или текстовом виджете, когда я щелкаю мышью по этой записи / тексту в Perl/Tk?
Может кто-нибудь пролить свет с моей проблемой в качестве заголовка? У меня есть и текстовые виджеты, и виджеты ввода в созданной мной форме, но как-то мне хотелось бы, чтобы я мог что-то сделать, например, для некоторых виджетов текста и ввода, я поместил бы в них формулировку "" и если пользователь захочет использовать Эта запись, они могут просто щелкнуть мышью по столбцу и "" формулировки будут автоматически очищены. Могу ли я знать, как это сделать? Вот код, который у меня есть без щелчка мышью, чтобы очистить функцию. Благодарю.
#This section apply text widget.
$mwf->Label(-text => 'Waiver',
-justify => 'left'
)->grid(-sticky => 'w', -column => 0, -row => 8);
my $scrollbar = $mwf->Scrollbar()
->grid( -sticky => 'ns',-column=>2, -row => 8);
my $waiver = $mwf->Text(-height => 5,
-width => 100,
-background => "white",
-wrap => 'word',
-yscrollcommand => ['set' => $scrollbar],
)->grid(-sticky => 'w', -column => 1, -row => 8);
#This section apply entry widget.
$mwf->Label(-text => 'Exclude View',
-justify => 'left'
)->grid(-sticky => 'w', -column => 0, -row => 10);
my $exclude = $mwf->Entry(-width => 100,
-background => "white",
)->grid(-sticky => 'w', -column => 1, -row => 10);
push @entries, $exclude ;
$exclude -> insert('end', '<optional>') ;
1 ответ
Вы можете использовать привязку, которая вызывается при запуске события
формат $widget->bind('<event>' => callback);
Смотрите пример программы ниже
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
use Tk::Entry;
use Tk::TextUndo;
my $win = new MainWindow;
$win->geometry("400x300");
my $entry = $win->Entry()->pack;
my $text = $win->TextUndo()->pack;
$text->insert('end', 'default');
$entry->insert('end', 'default');
$text->bind('<FocusIn>' => \&textfocus);
$entry->bind('<FocusIn>' => \&entryfocus);
MainLoop;
sub textfocus {
my $info = $text->Contents();
if($info =~ /^default$/){
$text->delete('1.0', 'end');
}
}
sub entryfocus {
my $info = $entry->get();
if($info =~ /^default$/){
$entry->delete('0.0', 'end');
}
}
Больше информации о событиях perl\tk здесь: http://docstore.mik.ua/orelly/perl3/tk/ch15_02.htm
Редактировать:
Когда событие инициируется, и ссылка на вызывающий виджет передается в обратный вызов. Ниже приведен способ использования только одного подпрограммы обратного вызова для каждого виджета.
$text->bind('<FocusIn>' => \&w_focus);
$entry->bind('<FocusIn>' => \&w_focus);
MainLoop;
sub w_focus {
my $widget = shift;
my ($start, $info);
if($widget == $text){
$start = '1.0';
$info = $widget->Contents();
}
else {
$start = '0.0';
$info = $widget->get();
}
if($info =~ /^default$/){
$widget->delete($start, 'end');
}
}