سؤال

أواجه رمز بيرل هذا:

#!/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". أعرف ذلك لأنه ينفذ عبارة "طباعة dumper ..." فقط عند إغلاق النافذة. هل لدى أي شخص فكرة عما أفعله خطأ؟

هل كانت مفيدة؟

المحلول

إشارة "تغيير المجموعة"

تنبعث عندما تنتمي مجموعة أزرار الراديو التي تنتمي زر الراديو إلى التغييرات. ينبعث من ذلك عندما ينتقل زر الراديو من كونه وحيدًا إلى أن يكون جزءًا من مجموعة من أزرار أو أكثر ، أو العكس ، وعندما يتم نقل زر من مجموعة من الأزرار أو أكثر إلى واحدة مختلفة ، ولكن ليس متى تكوين المجموعة التي ينتمي إليها زر ما.

إنه حقًا لا يبدو كما تريد. أظن أنه يسمى تدمير النافذة.

أضفت الفرعية التالية

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

وضبط إشارة كل RadiObutton المتبادلة (تحت gtktogglebutton) على On_Radiobutton_Toggled ، والتي تفعل الآن ما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top