在Perl GTK+;2.

在Perl GTK+;2.,perl,menu,gtk,Perl,Menu,Gtk,我在树视图上有一个弹出菜单,用户在其中选择要从备份中恢复的机器。我想简化界面,制作一个子菜单,根据可用文件动态生成。这就是我到目前为止所做的: $restore_item->set_submenu($arc_menu); open( FILE, "archives.db" ) or die("Unable to open file"); foreach (<FILE>) { # if record is correct if ( $_ =~ /archive=(

我在树视图上有一个弹出菜单,用户在其中选择要从备份中恢复的机器。我想简化界面,制作一个子菜单,根据可用文件动态生成。这就是我到目前为止所做的:

$restore_item->set_submenu($arc_menu);
open( FILE, "archives.db" ) or die("Unable to open file");
foreach (<FILE>) {
    # if record is correct
    if ( $_ =~ /archive=(.+)/ ) {
        my $item = new Gtk2::MenuItem( "_" . $1 );
        $item->signal_connect( 'activate' => sub { print "selected\n"; });
        $arc_menu->append($item);
    }
}
close(FILE); 
$restore\u item->set\u子菜单($arc\u菜单);
打开(文件“archives.db”)或死亡(“无法打开文件”);
foreach(){
#如果记录正确
如果($\=~/archive=(.+)/){
my$item=new Gtk2::MenuItem(“33;”。$1);
$item->signal_connect('activate'=>sub{print“selected\n”;});
$arc_菜单->附加($item);
}
}
关闭(文件);

但是,在现实生活中,我必须阅读菜单项文本,因为文件可以动态变化,我不能依赖计数或其他东西。我不明白如何从回调中获取菜单项文本。

至少有两种选择。将可选参数传递到回调(用户数据)或从Gtk2::MenuItem(
$item->get_label
)获取标签

对于前者,您可以使用以下内容:

$item->signal_connect('activate' => \&on_button_activate, $1);
[...]

sub on_button_activate
{
        # Do whatever you need.  The second parameters is
        # user_data (the filename in this case).
        my ($item, $user_data) = @_;
        print $item->get_label;
        print $user_data;
}

我试过了,但我发现***无法通过位于./foo.pl第80行的包“Gtk2::CheckMenuItem”找到对象方法“get_label”。libgtk2perl2:1.223-1build3中不支持这一点吗?找到了我的答案:print$item->child->get_label;