2008-11-25 105 views
3

下面是错误的:这些Tk :: Perl中的Perl/Tk错误是什么意思?

 
$ perl ftper.pl 
Use of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in hash element at /usr/lib/perl5/vendor_perl/5.1 
/i686-cygwin/Tk/After.pm line 39. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 
se of uninitialized value $id in delete at /usr/lib/perl5/vendor_perl/5.10/i686 
cygwin/Tk/After.pm line 87. 

这里是Perl/Tk的代码:

#! /usr/bin/perl -w 

use strict; 
use Tk; 
use Tk::Scale; 
use File::DosGlob 'glob'; 


##################################################################### 
# Define variables        # 
##################################################################### 
my $UserID; 
my $Password; 
my $BnsNode; 
my $Status_msg = "BUILD SCRIPT!"; 

##################################################################### 
# Window variables       # 
##################################################################### 
my $mw; 
my $frmUserID; 
my $lblUserID; 
my $frmPassword; 
my $lblPassword; 
my $edtUserID; 
my $edtPassword; 
my $frmTop; 
my $frmBig; 
my $frmButtonLine; 
my $btnExit; 
my $btnSubmit; 
my $lblStatus; 
my $lblUnixNode; 
my $frmUnixNode; 
my $edtUnixNode; 

################################################################# 
# Main Logic       # 
################################################################# 
init_mainwindow(); 
MainLoop; 



################################################################# 
# init_mainwindow      # 
################################################################# 
sub init_mainwindow { 
    $mw = MainWindow->new; 
    $mw->title("BUILD"); 
    $mw->resizable(100, 100); 
    $mw->geometry("+175+100"); 

    # Top Level frame for top section of form. 
    $frmTop = $mw->Frame(-bd => 2, -relief => 'ridge') 
     ->pack(-side => 'top', -fill => 'x', -pady => 3); 


    $frmUserID = $frmTop->Frame(-bd => 2)->pack(
     -side => 'top', -fill => 'x'); 
    $lblUserID = $frmUserID->Label(-text => "Unix User ID:") 
     ->pack(-side => 'left'); 
    $edtUserID = $frmUserID->Entry(-textvariable => \$UserID, 
     -background => 'white')->pack(-side => 'left'); 


    $frmUnixNode = $frmTop->Frame(-bd => 2)->pack(
    -side => 'top', -fill => 'x'); 
    $lblUnixNode = $frmUserID->Label(-text => "BNS Number") 
     ->pack(-side => 'left'); 
    $edtUnixNode = $frmUserID->Entry(-textvariable => \$BnsNode, 
    -background => 'white')->pack(-side => 'left'); 


$frmPassword = $frmTop->Frame(-bd => 2)->pack(
    -side => 'top', -fill => 'x'); 
$lblPassword = $frmPassword->Label(
    -text => "Password: ")->pack(-side => 'left'); 
$edtPassword = $frmPassword->Entry(-textvariable => \$Password, 
    -background => 'white', -show => "*") 
    ->pack(-side => 'left'); 



# Top Level frame for bottom section of form. 
$frmButtonLine = $mw->Frame(-bd => 2, -relief => 'ridge') 
    ->pack(-side => 'top', -fill => 'x', -pady => 3); 
    $btnExit = $frmButtonLine->Button(-text => "Exit", 
     -command => \&close_mw, -width => 6)->pack(
     -side => 'right', -padx => 1); 
     $btnSubmit = $frmButtonLine->Button(-text => "Run Script", 
    -command => \&execute_script, -width => 6)->pack(
     -side => 'right', -padx => 1); 
    $lblStatus = $mw->Label(-textvariable => \$Status_msg, 
     -borderwidth => 2, -relief => 'groove') 
     ->pack(-fill => 'x', -side => 'bottom'); 

    $edtUserID->focus; 

} 


##################################################################### 
# excute_script        # 
##################################################################### 
sub execute_script { 
    unless (defined($UserID)) { 
     update_status("Must enter a user id!"); 
     $edtUserID->focus; 
     return 0; 
    } 
    unless (defined($Password)) { 
     update_status("Must enter a password!"); 
     $edtPassword->focus; 
     return 0; 
    } 

    update_status("$BnsNode ,$UserID "); 
} 

##################################################################### 
# close_mw        # 
##################################################################### 
sub close_mw { 
    $mw->destroy; 
} 


##################################################################### 
# update_status        # 
##################################################################### 
sub update_status { 
    my ($msg) = @_; 

    $Status_msg = $msg; 
    $lblStatus -> update; 
} 
+0

你能写一个简短的示例脚本来说明问题吗?这可以帮助你找出谁是造成这个问题的原因。 – 2008-11-25 22:12:32

+1

您使用的是哪个版本的Perl和Tk? – 2008-11-25 22:15:45

+0

不管多短,我都会遇到同样的问题。 Leon认为这是图书馆的问题。 – Paul 2008-11-26 00:46:15

回答

4

错误消息本身是简单的就够了:在

使用未初始化值的$ id的散列元素在... Tk/After.pm第39行。

在删除中使用未初始化的值$ id TE在... TK/After.pm线87

  • “的未初始化值使用”意味着你使用的值与undef(未定义)的值。
  • $id是未初始化变量的名称。
  • “在散列元素中”表示您使用该值作为散列键,例如$h{$id}
  • “in delete”表示您使用该值作为要删除的散列键。例如delete $h{$id}
  • “... Tx/After.pm”是发生错误的模块。
  • “第39行”和“第87行”是发生错误的行号(在模块中)。

Tk :: After给Perl/Tk应用程序提供了回调调度。诸如“在500毫秒之后(或每隔500毫秒)运行此功能。” $id是小部件上特定回调的标识符。

对警告做些什么更难。在您提供的代码中,我没有看到任何明确的对Tk :: After的调用。有可能您的Tk安装中存在触发警告的错误。使用Tk 804.028在Perl 5.10下运行时,我没有收到任何警告。

2

Someone else似乎有问题使用草莓Perl 5.10。我有一个印象,这是一个问题的库,而不是你的代码(早先在同一个函数中,哈希条目被删除,但只有在定义了$id,因此显然$id被定义不是保证)。

6

当我遇到这些问题时,我想找出是谁造成的。我把所有的警告成栈回溯,看看谁开始rukus:

 
use Carp; 
$SIG{__WARN__} = sub { &Carp::cluck } 
1

我看到有在x86 Cygwin的v5.10.0和804.028-1同样的问题。有趣的是,如果代码在调试器中执行,则不会出现问题,这表明代码编译/执行的方式不同。调试器内部和外部。

我怀疑底层的PerlTk代码是正确的,问题在于Perl源代码/可执行文件本身 - 应该将这种事情报告给谁?

MikeP

1

我得到同样的错误。我相信这是因为没有显示服务器在运行。更简单的测试是在Cygwin提示符下输入“widget”。它应该调出Tk小部件演示。如果我进一步发现任何问题,我会报告回来。