Perl Win32::Gui:获取当前获焦文本框的文本内容
解决Perl/Tk中获取焦点文本框内容的问题
我来帮你搞定这个问题!你的思路方向是对的,但有两个关键细节没处理好,咱们一步步修正:
核心问题:用错了文本框的内容获取方法
你之前用$handle->Text()来获取内容,但Perl/Tk里的AddTextfield创建的是**Tk::Entry控件**,这类控件获取内容的方法是get(),而Text()是给多行文本控件Tk::Text用的——这就是代码失效的主要原因。
正确的实现步骤
1. 全局绑定回车键事件
先把回车键绑定到主窗口,这样不管哪个文本框获焦,按下回车都会触发处理函数:
$mw->bind('<Return>', \&handle_return);
2. 编写处理函数获取焦点控件及内容
在处理函数里,$mw->GetFocus()确实会返回当前获焦的控件对象(不是主窗口),我们可以用它来获取内容和控件名称:
sub handle_return { # 获取当前获焦的控件对象 my $focused_widget = $mw->GetFocus(); # 先判断是不是文本框(避免其他非输入控件获焦的情况) if ($focused_widget && $focused_widget->isa('Tk::Entry')) { # 获取文本框内容 my $text_content = $focused_widget->get(); # 获取控件的名称(就是你创建时指定的-name值,比如txtSAP) my $widget_name = $focused_widget->cget(-name); # 这里添加你的后续处理逻辑 print "当前获焦的是【$widget_name】,内容:$text_content\n"; # 示例:根据不同控件做不同处理 if ($widget_name eq 'txtSAP') { # 处理身份号的逻辑 } elsif ($widget_name eq 'txtDokar') { # 处理dokar的逻辑 } } }
完整的可运行示例
把你的代码和上面的逻辑结合起来,完整代码如下:
use Tk; my $mw = MainWindow->new(-title => "Input Form"); # 创建标签和文本框 $mw->AddLabel( -name => "lblSAP", -top => 5, -left => 10, -width => 80, -text => "identity no.", ); $mw->AddTextfield( -name => "txtSAP", -pos => [5, 20], -size => [80, 20], -tabstop => 1, ); $mw->AddLabel( -name => "lblDokar", -top => 5, -left => 95, -width => 40, -text => "dokar", ); $mw->AddTextfield( -name => "txtDokar", -pos => [90, 20], -size => [40, 20], -tabstop => 1, -text => 'DRW', ); # 绑定回车键事件 $mw->bind('<Return>', \&handle_return); sub handle_return { my $focused_widget = $mw->GetFocus(); if ($focused_widget && $focused_widget->isa('Tk::Entry')) { my $text = $focused_widget->get(); my $name = $focused_widget->cget(-name); print "控件名称:$name\n内容:$text\n"; # 这里写你的后续处理代码 } } MainLoop;
额外说明
cget(-name)可以直接获取你创建控件时设置的-name属性值,完美满足你“获取控件名称”的需求。- 添加
$focused_widget &&的判断是为了避免没有任何控件获焦时(比如刚打开窗口)出现错误,让代码更健壮。
内容的提问来源于stack exchange,提问作者Lik
相关产品推荐
相关产品推荐

