GTK+ приложение на PHP

    image
    Многим трудно поверить, но на PHP можно писать не только говнокод и скрипты, но и небольшие GUI приложения. Небольшие, потому что тема не очень популярна и слабо освещена в силу того, что существуют более удобные и мощные средства для разработки, соответсвенно инструментарий довольно сырой. Хотя для написания приложений «для себя» или же курсовых\дипломных вполне подойдет.
    В статье приводится пример создания простого GTK+ приложения на PHP.

    GTK+ — кроссплатформенная библиотека элементов интерфейса, популярная в Linux системах и последнее время довольно часто используется в Windows.

    Попробую заранее ответить на вопрос: «Да зачем это нужно, можно же на Python написать?». Конечно же можно, но:
    1. Трудно поверить, но есть люди которые хорошо знают PHP и у них нету времени западло учить Python, но нужно написать GUI app.
    2. Написаное на PHP работает везде где есть PHP с необходимыми библиотеками(Windows, Linux, MaxOS).

    Начнем


    Обычно для демонстрации прелестей языка или библиотеки пишут HelloWorld!, но мы пойдем немного дальше и напишем калькулятор.

    Весь процесс довольно прост и состоит из двух шагов:
    1. Разработка интерфейса в Glade Interface Editor
    2. Разработка приложения с использованием созданного на предыдущем шаге интерфейса.

    Установка


    Конечно же для создания интерфейса не обязательно использовать Interface Builder. Glade файл представляет собой xml, который можно написать руками или же создать интерфейс непостредственно в PHP скрипте. Но так как цель даной статьи показать простоту создания приложений, мы пойдем простым путем и воспользуемся Drag'n'Drop редактором интерфейсов.

    Скачать можно тут: http://glade.gnome.org/sources.html
    Или же:
    [aptitude|yum] install glade

    PHP библиотека которую мы будем использовать работает только с PHP 5.1 и выше, поэтому обзаводимся оным: http://php.net/downloads.php

    По умолчанию GTK библиотеки нету в PHP, поэтому её нужно установить.
    Качаем: http://gtk.php.net/download.php
    Устанавливаем: http://gtk.php.net/manual/en/tutorials.installation.php
    Для установки на Linux лучше тянуть исходники из SVN. Перед конфигурацией нужно утановить cairo-php:
    pecl install cairo-beta

    Если конфигурация падает ошибкой: "`lt_if_append_uniq(lt_decl_varnames,..." делаем в папке php-gtk:
    cat /usr/share/aclocal/ltoptions.m4 /usr/share/aclocal/ltversion.m4 /usr/share/aclocal/ltsugar.m4 /usr/share/aclocal/lt~obsolete.m4 >> aclocal.m4

    После чего перезапускаем ./buildconf и ./configure

    Интерфейс


    Никаких сложных фич придумывать не будем, сделаем простой интерфейс.

    Сначала создаем Window из вкладки Common, которому ставим Visible=true. На окно перетягиваем Vertical Box с разделением на 3 региона. В верхний регион помещаем Menu Bar, в средний Text Entry, а в нижний Table(4x4) в которой создаем кнопки как на рисунке выше.
    Теперь пропишем обработчики событий для элементов интерфейса.
    Для каждой кнопки:
    1. Кликаем на кнопку
    2. Переходим на табу Signals
    3. В поле «Clicked» пишем enterValue для кнопок 0-9, performAction для кнопок операций и clearCalc для «С».
    4. Для того, чтобы в PHP можно было понять какая кнопка нажата, пропишем Name для каждой из них, например так:
      «0»: «input0»

      «9»: «input9»
      "*": «action_mul»
      "/": «action_div»
      "+": «action_add»
      "-": «action_min»
      "=": «action_calc»
      «C»: «action_clear»

    И последний штрих — выход из приложения при клике на File->Quit, для этого ставим обработчик quit для сигнала activate для этого пункта меню.

    После чего сохраняем созданную форму в файл calc.glade, в формате LibGlade, и помещаем в папку с будущим приложением.

    Программирование

    Создаем PHP файл «calc.php» в котором пишем:
    <?php
    $glade = new GladeXML('calc.glade');
    Gtk::main();
    

    Первая строка загружает файл с интерфейсом, вторая создает все элементы.

    Запускаем и радуемся форме:
    php calc.php

    Теперь нужно написать реализацию обработчиков событий и собственно сам калькулятор.

    Обработчики событий которые мы описали в Glade Interface Editor — обычные функции или методы PHP класса. В каждый обработчик при вызове передается один аргумент — объект для которого вызван обработчик. Для упрощения имя этого объекта будем использовать как идентификатор операции или значение которое нужно ввести.
    Создадим класс «Calc» который будет содержать обработчики событий и методы необходимые для проведения исчислений:
    <?php
    class Calc {
    	protected $glade;
    	protected $firstParam = null;
    	protected $operation = null;
    	
    	function __construct($glade) {
    		$this->glade = $glade;
    	}
    	/* Посчитать результат операции */
    	protected function calculate($operation) {
    		$secondParam = (float) $this->glade->get_widget('entry1')->get_text();
    		$firstParam = (float) $this->firstParam;
    		$result = 0;
    		switch($this->operation) {
    			case '*': 
    				$result = $firstParam * $secondParam; 
    				break;
    			case '/': 
    				$result = ($secondParam > 0 ? $firstParam / $secondParam : 0); 
    				break;
    			case '+': 
    				$result = $firstParam + $secondParam; 
    				break;
    			case '-': 
    				$result = $firstParam - $secondParam; 
    				break;
    		}
    		$this->glade->get_widget('entry1')->set_text($result);
    		$this->firstParam = $result;
    		$this->operation = null;
    	}
    	/* Выполнить операцию */
    	public function performAction($obj) {
    		if ($this->firstParam == null) {
    			$this->firstParam = $this->glade->get_widget('entry1')->get_text();
    			$this->glade->get_widget('entry1')->set_text('');
    		} 
    		if ($this->operation == null) {
    			$this->operation = str_replace(
    				array('action_mul', 'action_add', 'action_min', 'action_div'), 
    				array('*', '+', '-', '/'), 
    				$obj->name
    			);
    			$this->glade->get_widget('entry1')->set_text('');
    		} else {
    			$this->calculate($obj->name);
    		}
    	}
    	/* Добавить символ к текущему значению поля ввода */
    	public function enterValue($obj) {
    		/* Так как у нас имена кнопок input0..input1, нужно вырезать "input" и получим значение */
    		$this->glade->get_widget('entry1')->set_text(
    			$this->glade->get_widget('entry1')->get_text().
    			str_replace('input', '', $obj->name)
    		);
    	}
    	/* Очистить поле ввода,а также значение первой переменной и выполняемую операцию */
    	public function clearCalc($obj) {
    		$this->firstParam = null;
    		$this->operation = null;
    		$this->glade->get_widget('entry1')->set_text('');
    	}
    	/* Выход */
    	public function quit() {
    		exit;
    	}
    }
    

    И последнее, укажем, что все обработчики событий хранятся в классе Calc:
    $glade->signal_autoconnect_instance(new Calc($glade));

    Ну вот и все.
    php calc.php

    Весь код примера на Гитхабе: https://github.com/kooler/php-glade-example
    Поделиться публикацией

    Похожие публикации

    Комментарии 51

      +2
      Есть ещё связка PHP/Qt, тоже можно использовать для простых целей.
        0
        Для мелких целей конечно сойдет, но когда задача выходит из рамок «учебной» и «демонстрационной» то намного практичнее вспомнить/выучить Delphi, C, C++, etc.
        Хотя бы потому, что приложения на PHP уж очень прожорливые получаются.
          +8
          ИМХО Delphi лучше тоже забыть если задача выходит за пределы студ. проекта. А лучше сразу — забыть.
            +4
            Несмотря на то, что я в целом согласен, всеми любимый Total Commander написан в Delphi. Что, скорее, подтверждает высказывание, что в умелых руках и…
              +1
              Согласен. Мой любимый плеер aimp, аналогично написан в Delphi. Лично моё мнение — удобней и лучше плеера я ещё не видел.
                0
                Причем вроде на 2-ой или 3-ей версии…
                0
                Согласен со всеми комментариями.Фраза была сказана не для холивара за или против Delphi.
                Просто ставить его в один ряд с C, C++ — … моя душа не потерпела!!!
                0
                > Хотя бы потому, что приложения на PHP уж очень прожорливые получаются.
                Но вряд ли прожорливей (и тормознее) приложений на Java. Даже без прекомпиляции.
                  0
                  Вы неправы, проверьте любой бенчмарк (к примеру blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/)
                  Java в «общем» в разы быстрее php, конечно зависит всё от задачи. Но мало есть задач в которых php будет быстрее…
                    0
                    Java в GUI дико тормозит
                      0
                      В гуи тормозит не Java а отдельные программы и отдельные фреймворки, к примеру swing. Если их использовать и писать что-то более менее громоздкое, то да будет подтормаживать. Но вас никто не заставляет использовать тормозные фреймворки. Примеры — zend studio 5, netbeans 7… большие программы в котороых ничего не тормозит.
                0
                а можно содержимое файла «calc.glade» загнать в переменную и инициализировать интерфейс из нее?
                +14
                Вот линукс в браузере это круто, а гуй на php — это вселенское зло. А почему?
                  +1
                  Как по мне совсем не зло, если приложение небольшое и пишется не для enterprise сектора. Можете себе представить клиент для банка или электронную бухгалтерию написанную на PHP? Разработчики не очень развивают PHP в направлении разработки GUI приложений, поэтому библиотеки сыроваты да и документации(а тем более с примерами) не много.
                    0
                    Как по мне совсем не зло, если приложение не большое и написано не для enterprise сектора. Можете себе представить клиент банка или бухгалтерское приложение написанное на PHP? Разработчики не развивают PHP в сторону разработки GUI apps, поэтому библиотеки сыроваты да и документации(а тем более с примерами) не много.
                      –2
                      Потому что gtk+ гуй на php был сделан лет пять назад, ничего принципиально нового в таком решении нет. Насколько я знаю, нет вообще ни одной программы сколь-нибудь известной, написанной таким образом. Что как бы показывает нам всю нужность php за пределами сообщества начинающих программистов.
                      +2
                      Тоже пытался писать на PHP + GTK, но потом разобрался в PyGTK и понял, что это намного удобнее.
                        +1
                        Вообще, 1 в 1, только именование функций в PHP си-подобное. Согласен на счёт PyGTK, ООП это круто
                        0
                        А, как написать ПОЛНОЭКРАННОЕ приложение на PHP с обработкой нажатий клавиш и перемещения мыши (в перспективе тач-скрина)?
                          +1
                          Что вы понимаете под полноэкранным? Пример калькулятора из статьи тоже можно развернуть на весь экран, он обрабатывает перемещения мыши(можно нажимать на разные кнопки) и нажания клавиш клавиатуры(можно вводить текст в поле ввода). Многое зависит от целевой ОС. На iOS точно нельзя)
                            0
                            Полноэкранное приложение и окно, развернутое на весь экран — это две большие разницы если что.
                            0
                            Вообще здесь имеет смысл посмотреть как такие приложения разрабатываются под GTK. И может ли он вообще это. И если может, то можно сделать и через PHP-GTK
                            0
                            ($secondParam > 0 ? $firstParam / $secondParam : 0);
                            а если я хочу разделить 10 на -5? :)
                              –1
                              будет -2
                                –1
                                Статья написана не для демонстрации PHP Дзы. Класс взят просто для примера. Думаю там можно много чего нарыть)
                                  +3
                                  «Вы не должны этого хотеть» (с)
                                  =)
                                  0
                                  В свое время пробовал SiteFusion http://habrahabr.ru/blogs/php/95499/ — по-моему лучшее что можно придумать для «окошечек». Единственное но: SiteFusion работает по клиент-серверной схеме.
                                    –2
                                    Нужно использовать инструменты для того, для чего они создавались, PHP не создавался для разработки оконных приложений именно поэтому, как сказали раньше, это вселенское зло. Мы же не используем вилку для забивания гвоздей, хотя теоретически можно попробовать. Можете меня конечно заминусовать но как по мне это в высшей степени не профессионализм и быдлокодинг!
                                      0
                                      Задача статьи показать возможности языка и библиотеки, а не нести в мыссы мысль «Даешь больше ху… гуёвых PHP-приложух!»
                                        –3
                                        я возможно не прав, но мне кажется, что именно такие статьи культивируют не правильное использование языка.
                                          +3
                                          Не разделяю этих опасений: быдлокодер в статье просто не разберется, а хоть немножечко башковитый кодер и без того знает какие технологии для каких задач уместны.
                                      –14
                                      Здравствуй, велосипедист!
                                        +2
                                        Простите. Привет отряду велосипедистов!
                                        0
                                        gui… php… вещь немного странная, но иногда бывает нужно написать какую нить GUIёвину быстро и на 1-2 раза (да еще и для себя), не изучать же ради этого еще один язык
                                        в общем спасибо за статью, давно собираюсь попробовать, но было ощущение что проект (и QT) заглох за ненадобностью =)
                                          0
                                          Года 2 назад писал мини GUI приложение на Perl, что еще более «странно». Тоже было весело первое время, потом перешел на C# и тоже самое сделал быстрее и красивее.
                                            +3
                                            Надоели уже своим лозунгом PHP это «говнокод». Проблемный код появляется независимо от языка и использованных конструкций. Если язык со слабой типизацей позволяет писать такое мягкое «г», то язык с сильной типизацей делает это «г» жестче и проблемней. Не надо марать хороший язык. Некоторым (см фэйсбук) этот язык позволил быстро сколотить состояние, что ведет к мысли что качество опять же не зависит от языка.
                                            P.S. PHP привел в программирование многих не специалистов. Если у них появится GUI в инструментах лишь усилит их интерес к программированию.
                                              +3
                                              PHP это не говнокод. Просто подавляющее большинство PHP-кода — говнокод. Почему? Потому что в PHP обитает подавляющее большинство говнокодеров. Почему? Потому что быдло загорается идеей заработка в интернете и начинают смотреть всякие видео-курсы в которых дай бог синтаксис языка раскроют нормально, про алгоритмы я вовсе промолчу. Радует, что эти люди ничего не знают про GTK+, иначе уже гулял бы софт по интернету, с милой подписью «Для работы приложения требуется установленный php».
                                                0
                                                Думаю знают, на том же хакер-про-нет вроде фейки на php продавались.
                                                  +4
                                                  Позволю себе перевести это на человеческий язык:

                                                  php — язык с низким порогом вхождения, в котором «обитает» много людей «со стороны», как следствие — непрофессионализм.
                                                  С другой стороны, это язык, который привлекает людей в ИТ. И это хорошо. А про быдло… зря вы это.

                                                  Начинайте минусовать.
                                                    +1
                                                    Был на моей памяти подобный спор. Под конец оного в него включился человек примерно с таким вопросом:
                                                    «О, я погляжу тут много программистов. Подскажите, как хранить в памяти такую вот структуру данных?», далее он показывает данные, по структуре коии являются обыкновенным деревом, уровень вложенности конечно же неизвестен. Ему начали говорить о том, что надо реализовать обычное дерево и рекурсивно его заполнить. Привели пару ссылок на учебные материалы. На что он начал ругаться матом, говоря о том что ему, цитирую:
                                                    Нафиг не сдались все эти теории графов и прочие рекурсии, я вообще гуманитарий, не грузите плз! Покажите мне, как это кодом делается и я уйду!

                                                    Очевидно, что человек не понимает, даже нет, отказывается понимать элементарнейшие вещи, и просит сделать все за него. Тебе нужны такие люди в IT? Что-то я сомневаюсь. А ведь таких индивидов полным полно, и все как один кричат что они web-программисты. Программист не знающий что такое рекурсия. Спешите видеть.
                                                      0
                                                      «Такие люди» обеспечат меня работой.
                                                –4
                                                А потом запускаем софтину и смотрим как течет. А PHP течет довольно не плохо. Одно не могу понять, почему нельзя использовать языки предназначенные для этого, не не можете на С++, сложная работа с памятью, возьмите .NET или Mono. Вместо того, чтобы изучать весь этот гибридинг PHP, с библиотеками оконных интерфейсов изучите .NET, довольно все просто, есть хорошие среды разработки, есть MonoDevelop, есть Visual Studio (Express). В чем проблема-то?

                                                Что только люди не придумают, лишь бы мозгами не думать.
                                                  +1
                                                  Смешно предлагать альтернативой к хреновенькой, но кроссплатформенной технологии прибитый гвоздями к винде и версии netfx дотнет.

                                                  Только не надо оправдываться и показывать на Mono. Вот когда хоть одно серьезное приложение будет запускаться и там, и там без модификации — тогда и поговорим. На PHP уже может ;)

                                                  Да и кроме венды и линукса есть еще Mac.
                                                    0
                                                    Зато не смешно предлагать некий костыль, к сильно текущему скриптовому языку, который еще надо дополнительно установить, опять же пошаманить, либо собрать пак, который будет весить совсем не мало. И далеко не факт, что без модификаций софт на пхп заработает на всех платформах. Ну и к примеру как вы на пхп будете работать кросс-платформенно с настройками для разных пользователей, вам пхп сокроет эту работу.

                                                    Вообще полная кросс-платформенность невозможна и чем больше сокрытия, тем больше вы ударитесь головой о стену непонимания, почему же не работает. Опять же будет заметно меньше возможностей по приведению этого в порядок.

                                                    И если же вы считаете, что .NET прибит гворздями к винде, то могу лишь посочувствовать вам. Учитывая тот факт, что все больше и больше приложений делается на .NET и то что позволяет сэкономить очень много времени за счет мощного фреймворка и мощных инструментов разработки. То не думаю, что для серьезных приложений будет выбран PHP, который по сути ничего этого не имеет.
                                                      0
                                                      Вообще полная кросс-платформенность невозможна и чем больше сокрытия, тем больше вы ударитесь головой о стену непонимания, почему же не работает. Опять же будет заметно меньше возможностей по приведению этого в порядок.


                                                      И точно. Давайте все писать с нуля.

                                                      И если же вы считаете, что .NET прибит гворздями к винде, то могу лишь посочувствовать вам. Учитывая тот факт, что все больше и больше приложений делается на .NET


                                                      У вас тут логическая ошибка — 10 000 асечных клиентов под венду не делают технологию кроссплатформенной. И я, кстати, не сказал что .net — это плохо. Это хорошо, но не везде и не всегда, как и PHP. Но заменять одно другим — как-то совсем не вариант. Хотя-бы потому, что внятных технологий веб-разработки MS не предоставляет, IIS+ASP.NET давно и безвозвратно проиграли LAMP-подобным наборам.
                                                        0
                                                        Хм, я предложил писать с использованием машинного кода? С чего это надо писать с нуля? Не нужно кидаться из крайности в крайность.

                                                        Ну статья не про WEB, я согласен с тем, что у продуктов MS туго с Web частью, но здесь обсуждение идет все же про Desktop приложения.

                                                        Да и кстати, Mono на Mac себя чувствует совсем не плохо :)
                                                  –2
                                                  PHP: Hypertext Preprocessor у меня один вопрос: зачем?
                                                  Может еще формы к приложениям начнем с помощью html ваять?
                                                    +2
                                                    Да, формы к приложениям ваять с помощью HTML. К вашим услугам — PhoneGap, например.

                                                    Или с помощью XML. К вашим услугам — XUL и XAML.

                                                    Или подобием джаваскриптов. К вашим услугам — QML.
                                                    0
                                                    Почему-то PHP-GTK уже два года как не поддерживается создателями, хотя сам GTK развивается в ногу со временем.
                                                      +2
                                                      а еще для GUI-поделок на PHP есть вот такая штука от отечественных разработчиков: develstudio.ru/downloads/ (PHP DevelStudio), судя по всему так как все это сделано на Delphi, в результате получаются win-only приложения все-в-одном

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                      Самое читаемое