学习php-gtk2之事件绑定

上次我们在hello glade的时候看到,php-gtk2已经能够根据Glade输出的xml生成窗体了。但是在Glade中设定的Button事件,如何和php接口呢?看下面的例子:

Glade输出的xml

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="wndClose">
  <property name="visible">True</property>
  <property name="title" translatable="yes">Close me</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_NONE</property>
  <property name="modal">False</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="decorated">True</property>
  <property name="skip_taskbar_hint">False</property>
  <property name="skip_pager_hint">False</property>
  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <signal name="destroy" handler="gtk::main_quit"/>
  <child>
	<widget class="GtkButton" id="btnClose">
	  <property name="visible">True</property>
	  <property name="can_focus">True</property>
	  <property name="label">gtk-close</property>
	  <property name="use_stock">True</property>
	  <property name="relief">GTK_RELIEF_NORMAL</property>
	  <property name="focus_on_click">True</property>
	  <signal name="clicked" handler="onClickButton"/>
	</widget>
  </child>
</widget>
</glade-interface>

其中有这样一行,表示id为btnClose的button绑定了事件onClickButton

<signal name="clicked" handler="onClickButton"/>

下面是php实现的onClickButton:

<?php
$glade = new GladeXML(dirname(__FILE__) . '/helloglade.glade');

//这是重点,事件自动绑定
$glade->signal_autoconnect();

//当btnClose被点击的时候就会调用本事件
function onClickButton() {
    echo "button clicked!\r\n";
    Gtk::main_quit();
}

//Start the main loop
Gtk::main();
?>

在上面的例子中,很容易就完成了onClickButton函数的绑定,那么有没有oo一点的写法呢?再看下面的例子:

<?php
// 这里我们使用一个对象来代替function

class MyClass {
    //btnClose被点击的时候会调用本方法
    function onClickButton() {
        echo "MyClass->onClickButton!\r\n";
        Gtk::main_quit();
    }

    function staticMethod() {
        echo "MyClass::staticMethod()\r\n";
    }
}

$glade = new GladeXML(dirname(__FILE__) . '/helloglade.glade');

//这里是重点,自动绑定某个对象的方法
$myClassInstance = new MyClass();
$glade->signal_autoconnect_instance($myClassInstance);

Gtk::main();
?>

到了这一步,个人感觉php-gtk2的开发就比较顺畅了,只是程序的编译输出,目前还没有合适的方法。

作者: 发表于August 5, 2006 at 12:44 pm

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原始出处作者信息及此声明

Tags: ,

3 条评论 »

  1. 爱不完 于 2007-10-20 @ 16:44:57 留言

    请问想把网站弄进去 怎么弄呢?

  2. Wener 于 2010-12-25 @ 01:27:13 留言

    请问现在你找到编译输出的办法了吗?
    比如说编译为exe

  3. Volcano 于 2011-01-04 @ 22:34:18 留言

    最近不太care这个,感觉这样做出来的东西确实太玩具了

RSS 为此帖反馈评论 · 反向跟踪 网站

留条评论