要开始使用,我是没有经验的perl脚本,或使用gtk,但我一直在谷歌搜索和研究如何在过去两周左右。很难搞清楚我在哪里可以找到窗口上的gtk的PM,然后更加如此让它变得有些“工作”。但是,当然还有问题。
跳过上述内容,我有两个问题。对于一些相关的背景,我试图将一个mirc脚本移植到xchat,但为了做到这一点,我显然需要学习一个完整的“其他语言..但无论如何。因此,这两个问题是:
该窗口包含多个按钮,标签和文本区域。但是,除非单击标题栏并保持,否则窗口将被“冻结”。单击按钮不执行任何操作,甚至不显示已单击按钮,除非单击并保持标题栏。
我不知道如何初始化同一窗口的多个实例。我当然尝试过研究,但它要么不在那里,要么我还没有找到它。具体而言..我的mirc脚本要求允许存在多个实例,但我需要特定实例的按钮只影响该实例..依此类推。
关于问题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();
}
答案 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构建了图形界面。