从Tk :: Tree更改“-browsecmd”回调的行为

时间:2011-05-19 16:11:58

标签: perl tk


我的问题是当用户点击一个条目时,“-browsecmd”的子程序被调用两次。当按下鼠标左键和释放鼠标时,它会激活。是否可以告诉“-browsecmd”仅激活一次?

这是一个演示我的问题的示例脚本。每当用户点击一个条目时,就会调用两次打印函数。

#!/usr/bin/perl 

use strict;
use warnings;
use English qw( -no_match_vars );

use Tk;
use Tk::Tree;

my $mw   = MainWindow->new();
my $tree = $mw->Tree(
    -width     => '25',
    -browsecmd => \sub {
        my ($numbers) = @ARG;
        print $numbers. "\n";
    }
);

foreach (qw(one two three four five six )) {
    $tree->add( $ARG, -text => $ARG ); #populates the tree
}

$tree->pack();

MainLoop();

感谢您阅读我的留言。

EDIT1:忘记发布指向Tk::Tree Documentation

的链接

2 个答案:

答案 0 :(得分:2)

我已经四处寻找,发现Tk :: Tree真的是一个Tix Tree。进一步挖掘使用以下代码段找到tutorial(稍微调整一下):

  

示例:“我的browsecmd被调用两次

     
tixScrolledListBox .list -browsecmd Browse
proc Browse args {
    if {[tixEvent type] ne "<ButtonRelease-1>"} {
        puts "browsing [tixEvent value]"
    }
}

这看起来非常相关,但我不知道tixEvent是如何映射到Perl的。您可能需要直接询问Perl / Tk维护者(或提交错误报告)。

答案 1 :(得分:2)

有办法摆脱这种行为:

my $tree = $mw->Tree(
    -width     => '25',
    -selectmode => "single", # <= this makes it work
    -browsecmd => \sub {
        my ($numbers) = @ARG;
        print $numbers. "\n";
    }
);

通过浏览父窗口小部件的文档找到此内容:Tk::HListBINDINGS部分很有趣)。