You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:32