PHP通常是做为服务器端脚本执行,如果告诉你PHP可以编写普通的GUI程序,你应该很感兴趣.下面介绍的PHP-GTK就是PHP的GUI扩展.GTK是一个业界标准的图形库,具有良好的移植性.如果你用过linux的gnome桌面环境,对它应该不会陌生,Gnome就是在KDE遇到Qt许可证障碍后发展的自由软件,GTK则是其采用的图形库。

PHP-GTK采用的是组件思想(可见组件思想几十年前就有了),为此不能不提到tcl/tk语言。

Tcl/Tk 的发明人 John Ousterhout 教授在八十年代初,是伯克利大学的教授。在其教学过程中,他发现在集成电路 CAD 设计中,很多时间是花在编程建立测试环境上。并且,环境一旦发生了变化,就要重新修改代码以适应。这种费力而又低效的方法,迫使 Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了Tcl (Tool Command Language) 语言的产生。TCL经常被用于 快速原型开发,脚本编程,GUI和测试等方面。

Tcl 最初的构想的是希望把编程按照基于组件的方法 (Component Approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定“完整”功能的,可重复使用的组件。这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。不同的组件有不同的功能,用于不同的目的。并可为其它的应用程序所利用。当然, 这种语言还要有良好的扩展性, 以便用户为其增添新的功能模块。最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起, 使各个组件之间可互相“通信”,协同工作。程序设计有如拼图游戏一样,这种设计思想与后来的 Java 不谋而合。终于在1988 年的春天, 这种强大灵活的胶水 - Tcl 语言被发明出来了。

按照 Ousterhout 教授的定义,Tcl 是一种可嵌入的命令脚本化语言 (Command Script Language)。“可嵌入”是指把很多应用有效,无缝地集成在一起。

说起来也很类似于现在炒做的很热闹的.NET,.NET有一个IL,中间语言,你可以用合适的语言做组件,通过IL实现模块的衔接和重用。说白了,微软这个思想就是借鉴了十几年前的tcl/tk,只不过微软有钱可以做得更好而已。

这种结构的先进性不言而喻,有好的代码可重用性,简单易学,有良好的扩展性,可重用,执行效率比单纯的脚本高,功能也更强,解释语言,代码能够动态的改变,平台无关。Win32, UNIX, Mac 上都可以跑,代码紧凑,易于维护调试简单等等。这种方式为后来很多脚本语言采用,如python,perl 等,php脚本的天性也非常适合做这种扩展,php-gtk只是其扩展的一种。

PHP-GTK创始人Andrei Zmievski 回忆了 PHP-GTK 计划和创建的过程:

“我总是对 GUI 编程有着浓厚的兴趣。我发现 Gtk+ 是一个非常好的工具包。目睹了 PyGtk 和 GTK-Perl 的实现,我决定尝试 PHP 是否也能够被做成 Gtk+ 的接口。2000年8月,我有了更多的业余时间,于是我开始试验。我参考了 PyGtk 的实现方法,因为它有着相当完全的实现和漂亮的面向对象的接口。James Henstridge,PyG 的作者,在最初的筹备阶段提供了极大的帮助。

“手工写 Gtk+ 函数全部的接口几乎是不可能的事情,所以我把重点放在了代码生成上,就像 PyGtk 做的一样。代码生成器是一个PHP 程序,它可以读取包含 Gtk+ 类、常量和方法信息的一系列的 .defs 文件并生成与 PHP 相接口的 C 代码。无法自动生成的部分可以提交到 .overrides 文件。

“代码生成器和基础结构的工作花了我一定的时间,因为我在 2000 年秋天这段时间里只能花很少的时间在 PHP-GTK 上。在我把 PHP-GTK 给 Frank Kromann 演示过后,他产生了浓厚的兴趣,并开始帮助我完成代码生成器和 Win32 的实现。当我们写了第一个 Hello World 程序并设法使之工作之时,我们的喜悦之情溢于言表。两个多月后,这个工程初见成效,并于 2001 年 3 月 1 日发布了内部版本。

“感到 PHP-GTK 前景广阔,我便为它专门设置了邮件列表和 CVS 知识库。同时,gtk.php.net 网站也建立起来。”

一个简单的实例,更多的看安装包里面的 Demos。php-gtk 官方站点为 http://gtk.php.net,有在线手册供查询。目前 php-gtk 最高版本是 PHP-GTK2,还在进一步完善中。

可以从 http://gtk.php.net/download.php 下载一个完整的运行和测试软件包,在命令行下运行:

php demos/xxx.php

就可以测试里边带的演示程序。

相信第一次看到演示的人一定会大吃一惊:原来 PHP 真能开发 Win32 的 GUI 桌面程序呀!

以下是一个示例,保存成名为 mydemo.php 文件到 demos 文件夹中,运行命令:

C:/phpgtk2>php demos/mydemo.php

就会弹出一个小窗口,可以用鼠标拖拽改变它的大小,点击上面的按钮,窗口就关闭,然后在 DOS 窗口里输出“Hello World!”字符串。

<?php
      function destroy()
      {
        Gtk::main_quit();
      }

function hello()
      {
        global $window;
        print "Hello World!/n ";
        $window-> destroy();
      }
      //建立一个GtkWindow
      $window = &new GtkWindow();
      //将 "destroy " signal用connect() 方法连接到shutdown函式
      $window->connect("destroy", "destroy");
      //建立一个GtkButton,按钮文字为 "按我 "
      $button = &new GtkButton( "Click Me ");
      $button-> connect("clicked", "hello");
      //把GtkButton放到是container的GtkWindow中
      $window-> add($button);
      //显示$window以及它的所有child widget
      $window-> show_all();
      //进入程式主回圈(即程式启动之意)
      gtk::main();
    ?>

网眼测试感言:

PHP 能做到这一步着实让人很感慨!但感慨之后,又觉得怪怪的。
    首先是 PHP 在 Web 开发上的大行其道,遮掩了其桌面开发方面的光亮--还算不上光辉。而 PHP 在 Web 开发特别是网站开发方面,虽然早已经是业界老大,但其名分则一直是老三、老四的位置。这时,再谈桌面开发,则觉得是“不务正业”了。
    事实是,PHP-GTK 这个 PHP 分支是发展非常缓慢的,截至2010年8月份,其最近一次更新已经是2年半以前了。要么是资金困扰、要么是人力困扰、要么是看不到商业前景,总之这个项目随时都要胎死腹中的样子,好像一阵微风都能吹灭它。
    桌面开发,流行的是 VC++、Delphi、Winform(C#/VB.NET)、再勉强算上Java,好像根本没 PHP 什么事。本人觉得,既然借用的是 Linux 下的 GTK 库,去 Linux 下发展岂不是更好,为何非要往 Windows 这扇窗户里钻呢?PHP、Python的语法都有点怪异,不知道习惯了 VC++ 的人喜欢不喜欢?要说个人喜好,我还是最喜欢 C#,它吸收了 C/C++、JAVA等语言的优点,语法纯正、符合习惯,能同时开发 Webform 和 Winform 程序,应该是前途无量的。

用 PHP-GTK2 做 Win32 GUI 程序的更多相关文章

  1. 给Win32 GUI程序增加控制台窗口的方法

    给Win32 GUI程序增加控制台窗口的方法 2008年10月11日 星期六 下午 04:43 在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用Messag ...

  2. 使用python做一个爬虫GUI程序

    整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...

  3. QT +go 开发 GUI程序

      ,转载 https://blog.csdn.net/lanbery/article/details/81745611 如果你是一个墨守成规的coding,请移步其他内容,这部分内容可能不适合你.如 ...

  4. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  5. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  6. 客户端GUI程序开发漫谈

    这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水  去年夏天的时候,我用QT做了一个小工具 后来还用QT做了流程设计器 我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤来 说 ...

  7. 教程和工具--用wxPython编写GUI程序的

    wxPython是个很好的GUI库,对底层的C++库进行了封装,调用起来很方便,尤其是操作前台UI界面和后台多线程,两者配合很方便,做GUI程序最难是写界面尤其是布局. 关于wxPython,自己正在 ...

  8. 用pywinauto进行win32应用程序的测试

    之前做win32应用测试时,用过很多大家耳熟成详的工具,接触pywinauto之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了python动态对象的能力,使得代码即便于书定,也便于阅读, ...

  9. Windows下用python编写简单GUI程序的方法

    Python实现GUI简单的来说可以调用Tkinter库,这样一般的需求都可以实现,显示简单的windows窗口代码如下: python_gui.py #!C:\Python27\python.exe ...

随机推荐

  1. Spark分析之TaskScheduler

    TaskScheduler概述: TaskScheduler是一个可插拔任务调度接口,通过不同的SchedulerBackend进行任务的调度.主要功能如下: 1.一个TaskScheduler只为一 ...

  2. 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、RSS、VXLAN

    offload offload特性,主要是指将本来在操作系统协议栈中进行的一些数据包处理(如IP分片.TCP分片.重组.checksum校验等)放到网卡硬件中去做,降低系统 CPU 消耗,提高处理的性 ...

  3. python中函数的返回值

    函数返回值(一) <1>“返回值”介绍 现实生活中的场景: 我给儿子10块钱,让他给我买包烟.这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是 ...

  4. zabbix 主动模式监控

    参考网站:  http://www.mamicode.com/info-detail-1724685.html http://www.cnblogs.com/dadonggg/p/8609674.ht ...

  5. 51. linux卸载jdk

    看有的资料上说有些Linux自带的有jdk1.4:如果自带的有jdk1.4的话首先要把jdk1.4卸载掉.具体做法: 输入命令: #rpm -qa | grep gcj 如果输出没有内容,说明没有jd ...

  6. Ubuntu jdk 8 与 6 切换 (安装与配置)

    Switch To Oracle JDK8 Switch To Oracle JDK8 1.1 Switch Oracle JDK in the Unbuntu 14.04 Step1 : Downl ...

  7. Spring_JAP_CXF_maven

    发送 pom,xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...

  8. 万字总结:学习MySQL优化原理,这一篇就够了!

    前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的 ...

  9. JS时间格式和时间戳的互转

    //时间格式转为时间戳 function sjc(){ var date = new Date(); //时间对象 var str = date.getTime(); //转换成时间戳 } //时间戳 ...

  10. Delphi 变体数组 Dataset Locate 查找定位

    Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...