3

我有一个 perl TK 小部件,它有一个-command回调:

my $widget = $mw->Spinbox( -from => -1000, -to => 1000, -increment => 1, -width => 4, -textvariable => $textvariable, -command => sub { ... });

我想在命令 sub 内的小部件上调用一个方法。

如何以通用方式在回调中获取对小部件本身的引用(不是通过 $widget 的名称访问它,而是通过一些通用的方式)?

我已经查看了@_传递给子的参数,但它们只包含小部件的值和操作(例如“向上”)。我希望能够通过 $self 或“this”来访问小部件,就像在 javascript 中一样。

4

1 回答 1

5

有两种方法可以将参数传递给回调:

  1. 使用闭包。
  2. 传递一个包含回调和参数的匿名数组。

在这两种情况下,您都需要在将对象分配给它之前声明包含小部件的变量,否则它将不可用。

#!/usr/bin/perl
use warnings;
use strict;

use Tk qw{ MainLoop };

my $mw = 'MainWindow'->new();

my $button1;
$button1 = $mw->Button(-text    => 'Start',
                       -command => sub { $button1->configure(-text => 'Done') }
                      ) ->pack;

my $button2;
$button2 = $mw->Button(-text    => 'Start',
                       -command => [
                           sub {
                               my ($button) = @_;
                               $$button->configure(-text => 'Done');
                           }, \$button2
                       ]
                      ) ->pack;

MainLoop();
于 2021-06-26T11:12:14.093 回答