【问题标题】:How do I clear the text within an entry or text widget when I mouse click on that entry/text in Perl/Tk当我在 Perl/Tk 中单击条目/文本时,如何清除条目或文本小部件中的文本
【发布时间】:2014-05-27 15:51:39
【问题描述】:

有人可以用我的问题作为标题来解释一下吗?我在创建的表单中有文本和条目小部件,但不知何故,我希望如果我可以为某些文本和条目小部件做一些事情,我会在其中放置“”字样,如果用户想要使用该条目,他们只需鼠标单击该列,“”字样将自动清除。我可以知道该怎么做吗? 这是我没有单击鼠标即可清除功能的代码。谢谢。

#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>') ;

【问题讨论】:

    标签: perl perltk


    【解决方案1】:

    您可以使用触发事件时调用的绑定

    格式$widget-&gt;bind('&lt;event&gt;' =&gt; 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');
        }
    }
    

    【讨论】:

    • 非常感谢 Gabs,您的示例代码解决了我的问题!只是想知道,如果我要清除的不仅仅是一个条目或文本,我是否需要为每个小部件条目创建一个子例程或为您的示例发送文本子例程清除代码在某种程度上似乎是小部件名称 IE 的硬代码:$entry->delete ('0.0', 'end');.
    • 也许 Tk::TipEntry 是您正在寻找的?它在条目中显示提示,当您单击条目时,您可以键入文本。尖端消失。见metacpan.org/pod/Tk::TipEntry
    猜你喜欢
    • 2014-10-06
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多