为什么 Gtk2::Builder 会混淆我的信号?
我有这个 perl 代码:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
use Gtk2 '-init';
my $data;
my $builder_file = "lists.glade";
my $builder = Gtk2::Builder->new();
$builder->add_from_file( $builder_file )
or die "Couldn't read $builder_file";
$builder->connect_signals( undef );
my $window = $builder->get_object( "top_window" )
or die "Error while setting up GUI";
$window->show_all();
# Dealloc builder
$builder = undef;
Gtk2->main();
sub top_window_destroy_cb
{
Gtk2->main_quit();
}
sub on_radiobutton1_group_changed
{
my ($self, $choice) = @_;
print Dumper($self, $choice, $choice->get_text());
}
和这个构建器文件:
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="top_window">
<signal name="destroy" handler="top_window_destroy_cb"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkVButtonBox" id="vbuttonbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkRadioButton" id="radiobutton1">
<property name="label" translatable="yes">Pera</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="group_changed" handler="on_radiobutton1_group_changed" object="choice"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radiobutton2">
<property name="label" translatable="yes">Mika</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="choice">
<property name="visible">True</property>
<property name="label" translatable="yes">Choice</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
但它错误地将“on_radiobutton1_group_changed”与来自“top_window”的“destroy”信号连接起来。我知道这一点是因为它仅在关闭窗口时执行“print Dumper...”语句。有谁知道我做错了什么?
I'm having this perl code:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
use Gtk2 '-init';
my $data;
my $builder_file = "lists.glade";
my $builder = Gtk2::Builder->new();
$builder->add_from_file( $builder_file )
or die "Couldn't read $builder_file";
$builder->connect_signals( undef );
my $window = $builder->get_object( "top_window" )
or die "Error while setting up GUI";
$window->show_all();
# Dealloc builder
$builder = undef;
Gtk2->main();
sub top_window_destroy_cb
{
Gtk2->main_quit();
}
sub on_radiobutton1_group_changed
{
my ($self, $choice) = @_;
print Dumper($self, $choice, $choice->get_text());
}
and this builder file:
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="top_window">
<signal name="destroy" handler="top_window_destroy_cb"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkVButtonBox" id="vbuttonbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkRadioButton" id="radiobutton1">
<property name="label" translatable="yes">Pera</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="group_changed" handler="on_radiobutton1_group_changed" object="choice"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radiobutton2">
<property name="label" translatable="yes">Mika</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="choice">
<property name="visible">True</property>
<property name="label" translatable="yes">Choice</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
But it falsely connects "on_radiobutton1_group_changed" with "destroy" signal from "top_window". I know this because it executes "print Dumper..." statement only when closing window. Does anyone has idea what I'm doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
听起来确实不是你想要的。我猜它是在破坏窗户时调用的。
我添加了以下子项
,并将每个单选按钮的切换信号(在 GtkToggleButton 下)设置为 on_radiobutton_toggled,它现在可以执行您想要的操作。
It really doesn't sound like what you want. I'm guessing it is called on destruction of the window.
I added the following sub
and set the each radiobutton's toggled signal (under GtkToggleButton) to on_radiobutton_toggled, which now does what you want.