2010-02-26 37 views
1

我在这个Perl代码:为什么Gtk2 :: Builder混淆了我的信号?

#!/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()); 
} 

这Builder文件:

<?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” “消灭” 的信号。我知道这一点,因为它仅在关闭窗口时执行“print Dumper ...”语句。有没有人知道我在做什么错了?

回答

2

的“基团的改变”信号

当组单选按钮,一个无线电按钮所属的变化触发。当单选按钮从单独切换到成为一组2个或更多按钮的组成部分时,或者当按钮从一组2个或更多按钮移动到另一个按钮时发出,而不是当按钮所属组的组成变化。

它确实听起来不像你想要的。我猜它被称为破坏窗户。

添加以下子

sub on_radiobutton_toggled { 
    my $self = shift; 
    if ($self->get_active) { 
     print Dumper($self, $self->get_label); 
    } 
} 

,并设置(下GtkToggleButton)的每个单选按钮的触发信号on_radiobutton_toggled,现在你想要做什么。

+0

我不能更无知,谢谢。 – XoR 2010-02-27 13:33:21

+0

我喜欢perl-gtk2与C接口有多接近,所以即使所有示例代码都在C中,devhelp也是非常有用的。 – MkV 2010-02-27 14:29:11