2014-05-27 2 views
0

Может ли кто-то пролить свет на мою проблему как заголовок? У меня есть как текстовые, так и виджеты ввода в той форме, которую я создал, но каким-то образом я желаю, если бы я мог что-то сделать, например, для некоторых виджетов для ввода текста и ввода, я поместил бы в нем текст «», и если пользователь захочет использовать эта запись, они могут просто щелкнуть мышью по столбцу, а «» формулировки будут автоматически очищены. Могу ли я узнать, как это сделать? Вот код, который у меня есть без мыши, чтобы очистить функцию. Благодарю.Как очистить текст внутри элемента ввода или текстового виджета, когда я нажимаю на эту запись/текст в 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>') ; 

ответ

2

Вы можете использовать привязку, который вызывается при наступлении события

формат $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#INDEX-2191

Редактировать:

Когда событие инициировано, и ссылка на вызывающий виджет передается на обратный вызов. Ниже приведен способ использования только одного элемента обратного вызова для каждого виджета.

$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'); 
    } 
} 
+0

Спасибо, связка Габса, ваш образец кода решает мои проблемы! Просто интересно, если у меня есть больше, чем запись или текст для очистки, мне нужно создать подпрограмму для каждой записи виджета или текста вашего образца, код оформления подпрограммы каким-то образом представляет собой жесткий код для имени виджета IE: $ entry-> delete ('0.0', 'end') ;. – Grace

+0

@Grace см. Мое обновление – Gabs00

+0

Большое спасибо Gabs! – Grace

 Смежные вопросы

  • Нет связанных вопросов^_^