用PHP写桌面程序

提醒:本文最后更新于 4087 天前,文中所描述的信息可能已发生改变,请谨慎使用。

写多了网页程序,是会对桌面程序抱有很深的怨念的。也不记得是哪天无意间搜到了PHP-GTK这种逆天的东西了,初看感觉道路一片光明(往后看你就会明白我为什么这么说了)。遂对它有了深深的执念。

下载了这货的二进制包,结果还搜了半天的教程才会使用它。而且官方手册没有中文包(虽然放了中文包的下载地址,不过居然404!满满的都是坑啊!),为此我还下了一番决定准备翻译官方文档呢。当然,目前为止我只是翻译了教程部分,关键的手册部分都木有开始就决定把这个计划腰斩了啊!如果有需要的同学可以点击这里:PHP-GTK 2教程。通篇教程是用MardownPad编写并输出的。你们不要问我为什么好好的分页教程被我活生生的整合到一个页面去了还不给打标签,我就是喜欢,你们能怎么样~恩哼!

简单说说PHP-GTK2这货怎么使用吧,其实没有官方手册讲的那么痛苦。首先去官方下载页面下载程序,你会发现很多各式各样英文名字很牛逼但是你完全不懂是什么的包,然后你最好遵从博主的建议去下载php-gtk-2.0.1 Windows binary pack这个文件。好了博主已经很好心的把你要下载的链接贴上来了,大家就快感恩戴德的去下载吧。下载好了之后把它解压到一个文件夹,比如就是php-gtk2这个文件夹好了。程序默认带了几个Demos,放置在demos文件夹下。打开CMD窗口进入到php-gtk2这个文件夹,运行php demos/phpgtk2-demo.php。然后很神奇的事情就发生了,哈哈!所以使用方法就是CMD到php-gtk2这个文件夹下然后带上你要运行的文件就好了。据说把文件夹加到环境变量中后不用cd到文件夹下也行,这个我没有多做测试,大家有兴趣可以测试一下。

大家可能要问我怎么将PHP程序打包成EXE程序了。目前我测试过许多方法,都不尽人意。表现最好的只有PriadoBlender这货了。什么?PriadoBlender这货是什么?对不起,虽然我很想贴一些简介来介绍一下它的,不过一个官网都死掉了的软件你想要官方简介?想多了吧亲!好吧,以上是调侃一下PHP-GTK2的穷途末路的,大家不要当真。PriadoBlender就是我说的打包程序了,它自己本身也是用PHP-GTK制作的。介于官网已死(有事烧纸都没用了!),博主我再次很好心的把它上传到了BOX上以供大家下载。新建工程输入工程名称、工程文件、工程输入文件夹、使用的PHP-GTK2版本,使用的PHP版本,点击编译稍等片刻就可以在输出文件夹发现一大片文件出现了,你的程序就编译成功了的说。顺带说一句,这货对中文的支持不是很好,工程名文件名文件夹名最好不要带中文,不要怪我没有提醒大家哦!

讲了如何使用如何打包,下面就要说说如何编写这个比较重要的问题了。不过这个问题其实我也是讲不了多少的,因为我本身也是在手册中学习的啊。所以还是比较推荐大家老老实实的把手册看一遍,这比什么都强啊。附上我今天花了一天的时间写的计算器代码,希望能帮助大家的学习。不要问我为什么一个简单的计算器还要写一点!木有办法,博主的智商博主自己也感到十分捉急啊!

<?php
/*
//检查是否包含gtk,试试就可以了这部分代码其实可以删掉的
if (!class_exists('gtk')) {
    die("Please load the php-gtk2 module in your php.ini\r\n");
}
*/

$wnd = new GtkWindow();
$wnd -> set_title('计算器'); //设置窗体的标题
$wnd -> set_default_size(228,322);  //设置窗体的默认大小
$wnd->connect_simple('destroy', array('gtk', 'main_quit')); //当关闭窗体的时候结束主程序
//看教程你就会知道为什么会有上面这句代码的存在

//制造控件
//把所有需要的空间制造出来
//暂时需要一个Label控件显示数字,0-9,小数点,加号,减号,等于号,清除键这几个按键
$CLabel = new GtkLabel('0');
$CButton = array(); 
for($i=0;$i<10;$i++) $CButton[] = new GtkButton($i);
$CButton['plus'] = new GtkButton('+');
$CButton['minus'] = new GtkButton('-');
$CButton['equal'] = new GtkButton('=');
$CButton['point'] = new GtkButton('.');
$CButton['clean'] = new GtkButton('C');

//控件布局
//$wnd最后只能添加一个控件,所以我们必须先用一个大容器把所有的小控件包进来,目前大容器是$table
//table的五个参数:控件,左边距,右边距,上边距,下边距
$CLabel -> set_justify(Gtk::JUSTIFY_RIGHT);  //居右,但是好像这句不来事。
$table = new GtkTable(5,4);  
$table->attach($CLabel, 0, 4, 0, 1);
for($i=1;$i<10;$i++) {
	$quotient = floor($i/3);
	$rest = $i % 3;
	if($rest == 0) {
		$rest = 3;
		$quotient--;
	}
	$top = 3 - $quotient;
	$bottom = $top+1;
	$right = $rest;
	$left = $right-1;
	$table->attach($CButton[$i], $left, $right, $top, $bottom);
}
$table->attach($CButton[0], 0, 2, 4, 5);
$table->attach($CButton['point'], 2, 3, 4, 5);
$table->attach($CButton['plus'], 3, 4, 2, 3);
$table->attach($CButton['minus'], 3, 4, 3, 4);
$table->attach($CButton['equal'], 3, 4, 4, 5);
$table->attach($CButton['clean'], 3, 4, 1, 2);

//添加控件信号绑定
//信号以为当做一个动作的时候产生的信号,下面的简单解释就是当点击按钮出发相应的函数
//GtkButton::connect_simple的参数:信号(例如点击),触发函数, 传递参数1, 传递参数2...
foreach($CButton as $name => $button) {
	switch($name) {
		case 'plus':
			$button->connect_simple('clicked', 'Plus', $CLabel);
		break;
		case 'minus':
			$button->connect_simple('clicked', 'Minus', $CLabel);
		break;
		case 'equal':
			$button->connect_simple('clicked', 'Equal', $CLabel);
		break;
		case 'clean':
			$button->connect_simple('clicked', 'Clean', $CLabel);
		break;
		default:
			$button->connect_simple('clicked', 'Cal', $button, $CLabel);
		break;
	}
}

//定义了三个全局变量,$number是用来存储输入的数字的,$method是用来存储运算法则的,$status用来存储输入状态的
//$method是当点击加减等于等功能键的时候进行赋值或者清空
//$status默认是为真的,也及时在输入状态,一当点击功能键则返回假,即非输入状态。存在这两种状态是为了区别没有点击功能键的时候输入数字是添加在末尾的,点击功能键之后输入数字是要清空标签控件然后添加的。
$number = 0;
$method = '';
$status = true;
function Cal(GtkButton $button, GtkLabel $CLabel) {
	global $status;
	$Text = $button->get_label();
	$BeforeText = $CLabel->get_text();	
	if($status && $BeforeText != '0')	{
		$Text = $BeforeText.$Text;
	} else {
		$status = true;
	}
	$CLabel->set_text($Text);
}
function Calculate(GtkLabel $CLabel) {
	global $number, $method;
	$num = $CLabel->get_label();
	switch($method) {
		case '+':	
			$number += $num;
		break;
		case '-':	
			$number -= $num;
		break;
		default:
		break;	
	}
}
function Plus(GtkLabel $CLabel) {
	global $number, $method, $status;
	if($method != '' && $status) {
		Calculate($CLabel);
	} else {
		$number = $CLabel->get_label();
	}
	$method = '+';
	$status = false;
	$CLabel->set_label($number); 
}
function Minus(GtkLabel $CLabel) {
	global $number, $method, $status;
	if($method != '' && $status) {
		Calculate($CLabel);
	} else {
		$number = $CLabel->get_label();
	}
	$method = '-';
	$status = false;
	$CLabel->set_label($number); 
}
function Equal(GtkLabel $CLabel) {
	global $number, $method, $status;
	Calculate($CLabel);
	$method = '';
	$status = false;
	$CLabel->set_label($number);
}
function Clean(GtkLabel $CLabel) {
	global $number, $method, $status;
	$number = 0;
	$method = '';
	$status = true;
	$CLabel->set_label($number);
}

//窗体添加控件
$wnd->add($table);
$wnd->show_all(); //显示所有控件
Gtk::main();  //进入主程序循环
?>

程序的主要思路我也已经比较详细的注释在代码中了,有不懂的也可以在评论中提出。这里附上我打包好的计算器程序给大家提供参考学习,同样还是放在BOX的。不过打包好的程序文件夹大小居然有18M,压缩了也有6M这是直接打击我学习下去的想法啊。而且好像网上吐槽PHP-GTK的人还是比较多的,大部分的孩子都是说“这是PHP年轻时候干的傻事”,“这货一时爽,长期死全家”之类的。而且PHP说到底只是一单线程语言,对内存的控制也不是很好,想要用来写桌面程序真的是有点力不从心的。介于最近又在看Python,PHP-GTK又万年太监,官方文档也不清楚(基本的函数的参数解释都不全),最终决定还是放弃PHP-GTK的研究。最后感谢Jclyn同学的片头歌曲推荐。以上。

本文相关文件下载地址:PHP-GTK 2 | PHP-GTK2中文教程 | PriadoBlender | 自制简易计算器

Avatar
怡红公子 擅长前端和 Node.js 服务端方向。热爱开源时常在 Github 上活跃,也是博客爱好者,喜欢将所学内容总结成文章分享给他人。

2 评论

菠萝格格 from 博客志 Firefox29.0 Windows XP
2015-05-09 01:00:57 回复

php 真是一门强大的语言

Aaron Chrome25.0 Windows XP
2013-03-13 13:05:43 回复

php 写桌面 哈哈,大开眼界~