带有uni参数集的Perl IUP GUI按钮操作

带有uni参数集的Perl IUP GUI按钮操作,perl,user-interface,iup,Perl,User Interface,Iup,我使用的是由实现的Perl IUP模块,我喜欢它,因为它使用起来很方便,而且看起来还不错 我需要从列表中创建一个带有多个按钮的框架框(比如40-50)。我可以在遍历数组的for循环中轻松创建它(双数组,每行包含“Name”和value) ` 按钮以漂亮的网格形式出现在GUI中。现在我的问题是,如何从每个按钮操作发送单独的唯一值? 我知道在创建按钮时,这些值是静态链接的 但不知何故,这种类似的实现我可以让它在PerlTK中工作,因为我从这个IUP开始,我不想回到TKperl,开始从sratch编写

我使用的是由实现的Perl IUP模块,我喜欢它,因为它使用起来很方便,而且看起来还不错

我需要从列表中创建一个带有多个按钮的框架框(比如40-50)。我可以在遍历数组的for循环中轻松创建它(双数组,每行包含“Name”和value) `

按钮以漂亮的网格形式出现在GUI中。现在我的问题是,如何从每个按钮操作发送单独的唯一值? 我知道在创建按钮时,这些值是静态链接的

但不知何故,这种类似的实现我可以让它在PerlTK中工作,因为我从这个IUP开始,我不想回到TKperl,开始从sratch编写我的整个GUI。 `

`
如何在perl IUP框架中工作?谁能告诉我一个窍门吗?:)

您的示例存在一些问题。我添加了一点以使其可运行:

use IUP ':all';
use strict;
use warnings;
use v5.30;

my @ITEMNAME = ([0,0,foo=>'btn_foo'],
                [0,0,bar=>'btn_bar']
                );
my @ChildsSetOfButtons=();
foreach my $array (@ITEMNAME)
{
    my $tempButton = IUP::Button->new(
                                      TITLE=>$array->[2],
                                      SIZE=>"50x20",
                                      FONTSTYLE=>'bold',
                                      FONTSIZE=>"10");

    # alternative: copied value
    # my $value = $array->[3];
    # $tempButton->ACTION( sub {selOrder($value); });

    $tempButton->ACTION( sub {selOrder($array->[3]); });

    push(@ChildsSetOfButtons,$tempButton);

}
my $tableOfButton = IUP::Frame->new(
                TITLE=>"Items",
                child=>
                    IUP::GridBox->new( child=> [@ChildsSetOfButtons],
                                       NUMDIV=>4, 
                                       ORIENTATION=>"HORIZONTAL"),
                MARGIN=>"5x5",
                EXPANDCHILDREN =>"YES",
                GAPLIN=>10,
                GAPCOL=>10);
my $dlg = IUP::Dialog->new( TITLE=>"Test Dialog",
                            MARGIN=>"10x10",
                            child=> $tableOfButton,);

# Do you want changes like these being reflected in the callback?
$ITEMNAME[1]->[3] = 'another_value';
$ITEMNAME[0] = [];    

$dlg->Show;

IUP->MainLoop;

sub selOrder{
    my $val = shift;
    say "you pressed $val";
}
我添加了
strict
,并使变量具有词法性。您正在循环中创建按钮,但是
push
语句在循环之外。因此,您的按钮未添加到
@ChildsSetOfButtons

您的回调子引用了
$array->[3]
,它是
@ITEMNAME
的别名。如果更改了
@ITEMNAME
中的值,这可能会导致意外的副作用。
您可以通过将值复制到循环内的词法变量中并在回调中使用它来避免这种情况。这样,您就得到了一个闭包,其值与
@ITEMNAME

解耦。我的Push语句在循环中,在问题帖子中的代码格式化过程中,我可能已经将其向下移动了。但你的“替代方案:复制价值”的解决方案对我很有效!!我接受了你的消息来源,并试图逃跑。因为我有Perl5.28,所以我删除了依赖项,并尝试了本地复制的替代解决方案,它的工作方式就像Gem一样。也许您的代码可以在5.32开箱即用版本中工作。我将在某个时候将perl更新为最新版本。再次非常感谢,它救了我一天:)版本声明不重要。(say()除外,该功能长期可用。)
foreach my $array (@ITEMNAME)
{
    $fr2->Button(-text=>$array->[2],
                 -padx => 6,
                 -font => ['arial', '10', 'normal'],
                 -foreground  => 'blue',
                 -command => [\&writeUARTDirect,$array->[3]],
                )->pack(-side=>'bottom');
}
use IUP ':all';
use strict;
use warnings;
use v5.30;

my @ITEMNAME = ([0,0,foo=>'btn_foo'],
                [0,0,bar=>'btn_bar']
                );
my @ChildsSetOfButtons=();
foreach my $array (@ITEMNAME)
{
    my $tempButton = IUP::Button->new(
                                      TITLE=>$array->[2],
                                      SIZE=>"50x20",
                                      FONTSTYLE=>'bold',
                                      FONTSIZE=>"10");

    # alternative: copied value
    # my $value = $array->[3];
    # $tempButton->ACTION( sub {selOrder($value); });

    $tempButton->ACTION( sub {selOrder($array->[3]); });

    push(@ChildsSetOfButtons,$tempButton);

}
my $tableOfButton = IUP::Frame->new(
                TITLE=>"Items",
                child=>
                    IUP::GridBox->new( child=> [@ChildsSetOfButtons],
                                       NUMDIV=>4, 
                                       ORIENTATION=>"HORIZONTAL"),
                MARGIN=>"5x5",
                EXPANDCHILDREN =>"YES",
                GAPLIN=>10,
                GAPCOL=>10);
my $dlg = IUP::Dialog->new( TITLE=>"Test Dialog",
                            MARGIN=>"10x10",
                            child=> $tableOfButton,);

# Do you want changes like these being reflected in the callback?
$ITEMNAME[1]->[3] = 'another_value';
$ITEMNAME[0] = [];    

$dlg->Show;

IUP->MainLoop;

sub selOrder{
    my $val = shift;
    say "you pressed $val";
}