لغة PHP أصبحت من أهم اللغات في عالم الويب والإنترنت لقوتها كلغة Server-Side لكنها وإن كانت كذلك فهي تبقى لغة مفسرة يمكن استخدامها لكتابة برامج صغيرة محلية أو حتى واجهات رسومية سأقوم بكتابة برنامج بواجهة رسومية بواسطة لغة PHP والمكتبة الرسومية GTK+.

التنصيب والإعداد

صفحة المشروع الرئيسية. لابد أولاً أن ننصب إن لم تكن PHP منصبة قبلاً فلا بأس. أفضل طريقة للتنصيب هي استعمال Gnope1 والذي سوف ينصب PHP مع إضافات GTK+ من خلال واجهة تنصيب في ويندوز. لاحظ أن Gnope سوف ينصب PHP4 أي الإصدار الأقدم كما أن هناك العديد من مشاكل التنصيب والإعداد بسبب توقف المشروع لمدة من الزمن ثم عودته ووعد المطورون بأداء أفضل. من أجل التنصيب اليدوي يتوجب عليك تنصيب الإضافات extensions ثم تعديل ملف php.ini إن كان لديك PHP سابقاً فعدل ملف php.ini وأضف السطر:

extension = php-gtk2.dll

أو في لينوكس بعد التنصيب من خلال

./buildconfig
./configure
make
make install

أضف السطر التالي إلى php.ini

extension = php_gtk2.so

ثم شغل البرنامج من المجلد الذي في إضافات GTK+. وذلك بالذهاب إليه في سطر الأوامر ثم كتابة اسم البرنامج “php” ثم فراغ ثم اسم الملف الذي كتبته. لا تنسَ تحميل دليل المبرمج المفصل للرجوع إليه عند كتابة البرامج.

البدء بالبرمجة

سأقوم أولاً بكتابة برنامج صغير يظهر واجهة.

<?php
if(!class_exists('gtk'))
 die("Cannot load GTK+ module.");
$window = new GtkWindow();
$window->set_title('Hello, World');
$window->connect_simple('destroy', array('gtk', 'main_quit'));

$lblHello = new GtkLabel('Hello, World');

$window->add($lblHello);

$window->show_all();
Gtk::main();
?>

شرح البرنامج:

if(!class_exists('gtk'))
 die("Cannot load GTK+ module.");

نقوم هنا بتفحص وجود ملفات GTK+ في PHP إن لم توجد سيخرج البرنامج مع طباعة رسالة خطأ.

$window = new GtkWindow();

نقوم هنا بتعريف متغير والذي هو class من نوع GtkWindows أي نافذة GTK.

$window->set_title('Hello, World');

السطر السابق يؤدي إلى تغيير عنوان النافذة إلى Hello, World.

$window->connect_simple('destroy', array('gtk', 'main_quit'));

يستدعي هذا السطر method والتي هي connect_simple والتي تقوم بدورها هنا بالخروج من البرنامج عن طريق تنفيذ Gtk::main_quit عند حدوث الإشارة signal والتي هي distroy أي عندما يضغط المستخدم زر إغلاق النافذة سننهي البرنامج ليس فقط النافذة

$lblHello = new GtkLabel('Hello, World');

يعرف السطر السابق عنوان Label نصي مكتوب فيه Hello, World.

$window->add($lblHello);

يضيف السطر السابق العنوان النصي إلى النافدة

$window->show_all();
Gtk::main();

السطرين السابقين يظهران النافذة والثاني ينقل التحكم إلى main في GTK والذي يقوم بدوره بكافة الأمور. لأنه ببساطة إذا لم نقم بهذا سيظهر البرنامج النافذة ثم يتابع تنفيذ أوامر البرنامج أي أنه سيغلقها وعندها سيكون إظهار النافذة عبارة عن وميض. عند تشغيل البرنامج يجب أن تظهر النافذة هكذا:

{% asset_img hello_world.png %} {% asset_img hello_world-win.png %}

الآن وقد قمنا بتشغيل البرنامج يمكننا كتابة برامج مفيدة: كتبت هذا البرنامج بسرعة وهو وإن كان يحتوي على ضعف في الرسم والتنسيق إلا أنه يظهر كيفية كتابة برامج رسومية مفيدة تعمل بلغة PHP

<?php
require 'include.php';

if (!class_exists('gtk')) {
  die("Cannot find GTK modulen");
}

$wnd = new GtkWindow();
$wnd->set_title('hashsum');
$wnd->set_icon($wnd->render_icon(Gtk::STOCK_DIALOG_AUTHENTICATION, Gtk::ICON_SIZE_MENU));
$wnd->set_resizable(false);

$wnd->connect_simple('destroy', array('gtk', 'main_quit'));

$menubar = new GtkMenuBar();
$file = new GtkMenuItem('_File');
$menubar->append($file);
$quit = new GtkMenuItem('_Quit');
$mnuFile = new GtkMenu();
$mnuFile->append($quit);
$file->set_submenu($mnuFile);
$quit->connect_simple('activate', array('gtk', 'main_quit'));

$lblAscii = new GtkLabel('_ASCII Text', true);
$lblmd5 = new GtkLabel('_MD5', true);
$lblsha1 = new GtkLabel('_SH1', true);
$lblhex = new GtkLabel('_HEX', true);

$txtAscii = new GtkEntry();
$txtAscii->set_max_length(24);
$txtmd5 = new GtkEntry();
$txtsha1 = new GtkEntry();
$txthex = new GtkEntry();

$txtmd5->set_property('editable', false);
$txtsha1->set_property('editable', false);
$txthex->set_property('editable', false);

$btn = new GtkButton('Calculate');
$btn->set_flags(Gtk::CAN_DEFAULT);

$btnAbout = new GtkButton('About');

$lblAscii->set_mnemonic_widget($txtAscii);
$lblmd5->set_mnemonic_widget($txtmd5);
$lblsha1->set_mnemonic_widget($txtsha1);
$lblhex->set_mnemonic_widget($txthex);

$btn->connect_simple('clicked', 'calc', $txtAscii, $txtmd5, $txtsha1, $txthex);
$btnAbout->connect_simple('clicked', 'about');
$txtAscii->connect_simple('activate', array($wnd, 'activate_default'));

$tbl = new GtkTable(3, 2);
$tbl->attach($lblAscii, 0, 1, 0, 1);
$tbl->attach($txtAscii, 1, 2, 0,1);
$tbl->attach($btn, 1, 2, 1, 2);
$tbl->attach($lblmd5, 0, 1, 2, 3);
$tbl->attach($txtmd5, 1, 2, 2, 3);
$tbl->attach($lblsha1, 0, 1, 3, 4);
$tbl->attach($txtsha1, 1, 2, 3, 4);
$tbl->attach($lblhex, 0, 1, 4, 5);
$tbl->attach($txthex, 1, 2, 4, 5);
$tbl->attach($btnAbout, 0, 2, 5, 6);

$box = new GtkVBox();
$box->pack_start($menubar);
$box->pack_start($tbl);

$wnd->set_default($btn);
$wnd->add($box);
$wnd->show_all();
Gtk::main();
?>

يقوم البرنامج السابق بإدارج الملف include.php والذي هو

<?php
function calc (GtkEntry $ascii, GtkEntry $md5, GtkEntry $sha1, $hex){

  $text = $ascii->get_text();
  $c = '';

  if (!$text)return;

  $md5->set_text(md5($text));

  $sha1->set_text(sha1($text));

  for ($i=0; $i<strlen($text); $i++){
    $c .= '0x' . dechex(ord($text[$i])) . ' ';
    $hex->set_text($c);
  }
}

function about (){

  $about = new GtkAboutDialog();

  $about->set_name('Hashsums');
  $about->set_version('1.0');
  $about->set_comments("Hashsums is programmed by GTK+ and PHP.\n Programmed By aborazmeh.\nwebsite: http://aboraz.me");
  $about->set_copyright('Copyright (C) 1982-2009 aborazmeh');
  $about->set_license(implode('', file('license.txt')));
  $about->set_logo($about->render_icon(Gtk::STOCK_DIALOG_AUTHENTICATION, Gtk::ICON_SIZE_DIALOG));
  $about->set_icon($about->render_icon(	Gtk::STOCK_ABOUT, Gtk::ICON_SIZE_MENU));
  $about->set_website('http://aboraz.me');

  $about->run();
}
?>

سأشرح بعض الأشياء شرحاً سريعاً ويمكنك مراجعة دليل المبرمج لمراجعة أية functions أو methods مستعملة.

أولاً ملف include.php يحوي دالتين الأولى تحسب الـmd5 و sha1 و hex للنصوص التي تمرر إليها عن طريق مربع نص أدخل فيه المستخدم شيئاً والدالة الثانية تقوم بإظهار مربع حوار “حول البرنامج” وتستخرج معلومات الرخصة من ملف license.txt والتي هي في هذه الحالة GPL3.

الملف الثاني مكون من جدول يتضمن عناصر التصميم، يمكن تعداد حاويات العناصر لرؤية أفضل لكنني لم أفعل ذلك راجع دليل المبرمج

في هذا الجدول يوجد مربع نص ليكتب المستخدم بداخله ما شاء تحته زر ليشغل الدالة calc ويعيد بعد ذلك إظهار النتائج وأخيراً زر لإظهار نافذة “حول البرنامج” وطبعاً قائمة للخروج من البرنامج.

window window / windows about about / windows


  1. توقف العمل على مشروع gnope، والموقع أيضاً توقف عن العمل، إذا أردت تحميل البرنامج، يمكن زيارة صفحة SourceForge أو الصفحة المحفوظة على أرشيف الإنترنت ↩︎