perl中的多个窗口实例,使用gtk构建器

时间:2012-03-09 08:07:07

标签: perl window glade

要开始使用,我是没有经验的perl脚本,或使用gtk,但我一直在谷歌搜索和研究如何在过去两周左右。很难搞清楚我在哪里可以找到窗口上的gtk的PM,然后更加如此让它变得有些“工作”。但是,当然还有问题。

跳过上述内容,我有两个问题。对于一些相关的背景,我试图将一个mirc脚本移植到xchat,但为了做到这一点,我显然需要学习一个完整的“其他语言..但无论如何。因此,这两个问题是:

  1. 该窗口包含多个按钮,标签和文本区域。但是,除非单击标题栏并保持,否则窗口将被“冻结”。单击按钮不执行任何操作,甚至不显示已单击按钮,除非单击并保持标题栏。

  2. 我不知道如何初始化同一窗口的多个实例。我当然尝试过研究,但它要么不在那里,要么我还没有找到它。具体而言..我的mirc脚本要求允许存在多个实例,但我需要特定实例的按钮只影响该实例..依此类推。

  3. 关于问题1,我不知道.xml glade文件是否重要,所以我不会立即发布。但是我会发布调用它的代码:

    my $glade_file = "window3.xml";
    my $glade = Gtk2::Builder->new();
    $glade->add_from_file($glade_file);
    
    sub charopen {
        my $window = $glade->get_object('window1');
        $glade->connect_signals(undef, $window);
        my $hp_cur = $glade->get_object('HP_Cur');
        $window->set("title"=>$_[0][1]);
        $hp_cur->set("label"=>$ini->val($_[0][1],"HPC"));
        $window->show();
    }
    

1 个答案:

答案 0 :(得分:0)

图形界面设计依赖于事件处理。要正常工作,保留一个线程来处理用户事件(键盘,鼠标点击......)非常重要。这是在用户界面准备好接受用户交互时调用Gtk2->main()的目的。

要使事件线程退出事件循环,事件回调方法可以调用Gtk2->main_quit()

Gtk2::Builder从XML创建Gtk小部件层次结构。要获取同一窗口的多个实例,您必须为每个窗口创建一个构建器。

然后,您的事件回调方法必须获取有关哪个窗口已发送事件的信息,并且$user_data参数可用于该目标。

这是一个带有简单按钮单击回调的代码提案,它使用Perl引用哈希,因此您可以在窗口创建者代码和事件回调之间传递任意数量的信息:

sub createWindow($)
    my $windowTitle = $_[0];
    my $windowBuilder = Gtk2::Builder->new();
    $windowBuilder->add_from_file($glade_file);
    my $window = $windowBuilder->get_object('window1');
    my $hp_cur = $windowBuilder->get_object('HP_Cur');

    # Create hash with data (alternative: use Class::Struct for better code)
    my %window_user_data = {
        "title" => $windowTitle,
        "window" => $window,
        "hp_cur" => $hp_cur };
    # Pass hash reference as user data
    $windowBuilder->connect_signals(\%window_user_data);

    # prepare interface: set data model into view and then...
    $window->show();
}

# Click callback method defined on a button in window
sub button_click_callback($$) {
    my $button = $_[0];
    my $window_user_data_ref = $_[1];
    # get back data model from view
    print "Click received from button on "
       . $window_user_data_ref->{"title"} . "\n";
}

还有另一种处理每个窗口回调的方法,但它需要更多的Perl技能:您可以设计一个Perl包来为特定窗口创建一个对象实例,并使用$windowbuilder->connect_signals ($user_data, $windowcallbackinstance)。在这种情况下,这样的对象称为控制器,您已经基于Model-View-Controller (MVC) pattern构建了图形界面。

相关问题