为什么Gtk2的视觉:: Builder中混合了我的信号?
-
23-09-2019 - |
题
我在此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”,“破坏”的信号。我知道这是因为它执行“打印自卸车......”关闭窗口,只有当语句。有没有人有知道我做错了吗?
解决方案
在 “基团的改变” 信号
当组单选按钮,一个无线电按钮所属的变化触发。当单选按钮从孤独到作为一组的2个或多个按钮,或反之亦然,的一部分和切换该发射按钮时从一个组的2个或更多个按钮移动到不同的一个,而不是在该组的组合物,其一个按钮所属的变化。
这真的听起来并不像你想要什么。我猜它被称为窗口的破坏。
添加以下子
sub on_radiobutton_toggled {
my $self = shift;
if ($self->get_active) {
print Dumper($self, $self->get_label);
}
}
,并设置每个单选按钮的触发信号(GtkToggleButton下),on_radiobutton_toggled,现在你想要做什么。
不隶属于 StackOverflow