Как очистить текст в записи или текстовом виджете, когда я щелкаю мышью по этой записи / тексту в 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');
    }
}
Другие вопросы по тегам