Плохому магу тедди бир мешает (с) Пакет PHP-Gtk - это пакет, позволяющий создавать оконные приложения (GUI) на php. (большая просьба - не нужно обсуждать в этой теме, насколько это оправданно).... Преамбула: Собственно, по рабочим нуждам потребовалось написать оконное приложение, а, поскольку другими языками программирования я владею слабо, то решил использовать php. Во время установки и использования я столкнулся с рядом проблем, после курения мануалов, терзания рабочего компа и очернения кабинета сигаретным дымом, они были решены... Но - на русском языке гугль ничего мне не выдал про php-gtk. Практически все на английском. Решил описать здесь творческий процесс установки и использования php-gtk. Может быть, кому-то поможет. Установка, запуск и расширения: 1. Качаем (http://gtk.php.net/download.php) отсюда Gtk2. Например, php-gtk-2.0.1 Windows binary pack - http://gtk.php.net/do_download.php?down ... 32-nts.zip Пак с расширениями я не ставил.. Скачал, полюбовался - там в комплекте Код (Text): php_gtk_sourceview2.dll php_gtk_scintilla2.dll php_gtk_libglade2.dll php_gtk_html2.dll Стандартных (типа mysql, bz2) там нет. Их нужно ставить отдельно. Как это сделать, я опишу позже. А пока... 2. Распаковываем в любую папку на диске C:\. Открываем файл php-cli.ini Все, что в нем есть - это настройки для php-gtk. Вы можете указать любые настройки между секциями PHP: и [PHP-GTK]. [b]3.[/b] Запускается пакет путем указания пути к интерпретатору и к скрипту. С php-gtk поставляется стандартное демо, которое находится по адресу \demos\phpgtk2-demo.php/ Я запускаю из командной строки - C:\php-gtk2\php-win.exe C:\php-gtk2\demos\index.php [b]4.[/b] Думаю, Вам все равно потребуются стандартные расширения, но их установка может вызвать проблему. Хех.. И ошибку типа этой: [quote]"PHP Warning: PHP Startup: mysql: Unable to initialize module Module compiled with module API=20060613, debug=0, thread-safety=1 PHP compiled with module API=20060613, debug=0, thread-safety=0 These options need to match in Unknown on line 0" [/quote] Это означает, что текущему билду php-gtk необходимы расширения и php, скомпилированные без опции thread-safety. Эта проблема решается скачиванием и установкой пакета "PHP 5.2.8 Non-thread-safe zip package" Взять можно отсюда - [url=http://ru.php.net/distributions/php-5.2.8-nts-Win32.zip]http://ru.php.net/distributions/php-5.2.8-nts-Win32.zip[/url] После скачивания кидаем все файлы из папки /ext/ в папку ext нашего php-gtk, а корневые lib*.dll в корень php-gtk. [b]5.[/b] Теперь все, что осталось - добавить в наш php-cli.ini строчки с расширениями - etc. [quote]extension=php_bz2.dll extension=php_curl.dll[/quote] Также, имеет смысл описать в php.ini настройки, специфичные для каждого модуля - для этого можно взять любой рабочий php ini и скопировать секцию настроек модуля в наш php-cli.ini - etc. [quote][size=2][MySQL] ; Allow or prevent persistent links. mysql.allow_persistent = On ; Maximum number of persistent links. -1 means no limit. mysql.max_persistent = -1 ; Maximum number of links (persistent + non-persistent). -1 means no limit. mysql.max_links = -1 ; Default port number for mysql_connect(). If unset, mysql_connect() will use ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look ; at MYSQL_PORT. mysql.default_port = 3306 ; Default socket name for local MySQL connects. If empty, uses the built-in ; MySQL defaults. mysql.default_socket = ; Default host for mysql_connect() (doesn't apply in safe mode). mysql.default_host = ; Default user for mysql_connect() (doesn't apply in safe mode). mysql.default_user = root ; Default password for mysql_connect() (doesn't apply in safe mode). ; Note that this is generally a *bad* idea to store passwords in this file. ; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") ; and reveal this password! And of course, any users with read access to this ; file will be able to reveal the password as well. mysql.default_password = 1 ; Maximum time (in seconds) for connect timeout. -1 means no limit mysql.connect_timeout = 60 ; Trace mode. When trace_mode is active (=On), warnings for table/index scans and ; SQL-Errors will be displayed. mysql.trace_mode = Off[/size][/quote] Собственно, все. После этих действий у меня заработал php-gtk с расширениями. А посмотреть, какие расширения загружены, можно ф-ей extension_loaded() - [url=http://php.ru/manual/function.extension-loaded.html]http://php.ru/manual/function.extension-loaded.html[/url] [b]6.[/b] Ссылки Документация php gtk - [url=http://gtk.php.net/docs.php]http://gtk.php.net/docs.php[/url] Загрузка php gtk - [url=http://gtk.php.net/download.php]http://gtk.php.net/download.php[/url] Основное сообщество - [url=http://www.php-gtk.eu/]http://www.php-gtk.eu/[/url] Разработчик интерфесов - [url=http://php-gtk.eu/en/glade-3-341-build-for-windows-installer-included]http://php-gtk.eu/en/glade-3-341-build- ... r-included[/url] [u]p.s.[/u] Что хочется добавить - при возникновении ошибки программа дохнет, не выкидывая окна с предупреждениями, поэтому имеет смысл проверять на существование переменных (ф-й, классов), и может быть, вести лог. Но, здесь уже на вкус и цвет...
Вот, например, код очень простого скрипта на phpgtk, позволяющего соединиться с mysql-сервером и узнать информацию о введенной таблице. Требуемые расширения: mysqli Кодовая страница: utf8 PHP: <?php if (!class_exists('gtk')) { die("Please load the php-gtk2 module in your php.ini\r\n"); } /** * * @param GtkWindow $wnd Основное окно логина * * @param GtkEntry $txtUsername Поле ввода имени пользователя * @param GtkEntry $txtPassword Поле ввода пароля * @param GtkEntry $txtTable Таблица, о которой будет запрашиваться информация */ function login(GtkWindow $wnd, GtkEntry $txtUsername, GtkEntry $txtPassword, GtkEntry $txtTable) { //Получаем введенные данные - логин, пароль и таблицу $strUsername = $txtUsername->get_text(); $strPassword = $txtPassword->get_text(); $strTable = $txtTable->get_text(); //Проверяем, не пусты ли поля $errors = null; if (empty($strUsername)) { $errors .= "Вы не ввели логин.\r\n"; } if (empty($strTable)) { $errors .= "Вы не ввели низвание таблицы.\r\n"; } //Если есть ошибки if (!empty($errors)) { //Показываем диалоговое окно с ошибками $dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors); $dialog->set_markup( "Найдены ошибки:\r\n" . "<span foreground='red'>" . $errors . "</span>" ); $dialog->run(); $dialog->destroy(); } else { //иначе соединяемся с БД $conn = new mysqli('localhost', $strUsername, $strPassword, $strTable); if(!mysqli_connect_errno()) { //получаем информацию о таблице $q = 'DESCRIBE '.$strTable; $r = $conn->query($q); $message = null; $message .= "Соединение установлено\r\n"; while($s = $r->fetch_assoc()) $message .= print_r($s, 1); $conn->close(); } else $message = "Нет соединения с БД.\r\nПроверьте, правильно ли указаны параметры."; //Выводим диалоговое окно $dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors); $dialog->set_markup($message); $dialog->run(); $dialog->destroy(); } } //Создаем диалоговое окно $wnd = new GtkWindow(); $wnd->set_title('Подключение к серверу'); //Создаем кнопку $wnd->connect_simple('destroy', array('gtk', 'main_quit')); //Создаем винжеты $lblCredit = new GtkLabel("Подключение к серверу mysql\r\nи получение информации о таблице."); //Второй параметр указывает, что символы с подчеркиванием нужно парсить $lblUsername = new GtkLabel('_Имя пользователя', true); $lblPassword = new GtkLabel('_Пароль', true); $lblTable = new GtkLabel('_Имя таблицы', true); $txtUsername = new GtkEntry(); $txtPassword = new GtkEntry(); $txtTable = new GtkEntry(); $btnLogin = new GtkButton('_Логин'); $btnCancel = new GtkButton('_Выход'); //Какая кнопка должна срабатывать по нажатию (Alt+U или Alt+P)? $lblUsername->set_mnemonic_widget($txtUsername); $lblPassword->set_mnemonic_widget($txtPassword); $lblTable->set_mnemonic_widget($txtTable); //Уничтожаем окно, если нажат cancel /*Синтаксис ф-ии GObject::connect_simple int connect_simple(string signal, callback callback [, mixed userparam]); */ $btnCancel->connect_simple('clicked', array($wnd, 'destroy')); //ВЫзываем фунцию 'login' если нажат логин. После указания окна - идут пользовательские параметры $btnLogin->connect_simple('clicked', 'login', $wnd, $txtUsername, $txtPassword, $txtTable); //Размещаем наши кнопки на таблице /* Конструктор GtkTable ([int n_rows = 1 [, int n_columns = 1 [, bool homogeneous = false]]]); */ $tbl = new GtkTable(4, 3); /*Синтаксис ф-ии GtkTable::attach void attach(GtkWidget child, int left_attach, int right_attach, int top_attach, int bottom_attach [, GtkAttachOptions xoptions = Gtk::EXPAND|Gtk::FILL [, GtkAttachOptions yoptions = Gtk::EXPAND|Gtk::FILL [, int xpadding = Gtk::EXPAND|Gtk::FILL [, int ypadding = Gtk::EXPAND|Gtk::FILL]]]]); */ $tbl->attach($lblCredit, 0, 2, 0, 1); $tbl->attach($lblUsername, 0, 1, 1, 2); $tbl->attach($txtUsername, 1, 2, 1, 2); $tbl->attach($lblPassword, 0, 1, 2, 3); $tbl->attach($txtPassword, 1, 2, 2, 3); $tbl->attach($lblTable, 0, 1, 3, 4); $tbl->attach($txtTable, 1, 2, 3, 4); //Добавляем кнопки на сетку кнопок $bbox = new GtkHButtonBox(); $bbox->set_layout(Gtk::BUTTONBOX_EDGE); $bbox->add($btnCancel); $bbox->add($btnLogin); //Добавляем таблицу в окно $vbox = new GtkVBox(); $vbox->pack_start($tbl); $vbox->pack_start($bbox); $wnd->add($vbox); //Показываем все кнопки $wnd->show_all(); //Запускаем программу и ожидаем действий пользователя Gtk::main(); ?>
установка на *nix: 1. качаем исходники http://gtk.php.net/download.php 2. распаковываем 3. Код (Text): $ ./buildconf && ./configure && make 4. Код (Text): # make install 5. добавляем в php.ini Код (Text): extension=php_gtk2.so
Хотелось бы добавить к предыдущему посту - phpGtk, по-видимому, не работает под FreeBsd. Цитата из документации: Лично я подозреваю, что если под Фрей поставить эмулятор linux, и из-под него запускать phpGtk, то вполне вероятно, что все заработает. Так, например, под фрей запускается сервер counter-strike. Но на практике не проверял)
Не хочу создавать холивар, но ИМХО оконные приложения на PHP это жесть, проще на минимальном уровне JAVA SE прокурить, за пару дней простенькое оконное приложение без проблем напишешь)
ИМХО под десктоп в той JAVA SE и C++ несравнимо просто больше документации ИМХО также несравнимо больше коммьюнити ИМХО нужно меньше изобретать велосипедов. ИМХО молоток крутая тема для заколачивания гвоздей, при желании можно забивать гвоздь, потом снова доставать, при большой практике можно делать в стенках дырки нужного размера. Но дрелью это будет куда быстрее, удобнее и приятнее.
Ты не менеджер, а я не клиент. не надо меня парить размерами коммюнити. У GNOME коммюнити ничуть не меньше. А GNOME == GTK. Не слышу обьективной аргументации.
Поищи в Гугле документацию по PHP-GTK. А теперь для JAVA SE. Для меня это серьезный аргумент. Впрочем на вкус и цвет все фломастеры разные.
Да нет не плоха, просто эта мне куда больше нравится. Вообще у сановцев приятная документация. И на этом сайте можно больше инфы найти по AWT или Swing чем на том же phpclub.ru по PHP-GTK. Знаешь, иногда очень приятно, что можно, задать вопрос и тебе ответят. То что найду форум где мне ответят на насущный вопрос по AWT или по Swing я уверен. А вот то что мне помогут также по PHP-GTK очень сомневаюсь...
Нет, в итоге получается php-файл, запускаемый с помощью php-win.exe, как я описал выше. Рабочий пример программы - выше. Парни, я ж просил - это понятно, что есть дельфи, с и ява. Но есть и phpGtк. Лично мне удобнее писать приложения с помощью php. А рассуждать на эту тему - есть холивар чистейшей воды, и все равно каждый останется при своем мнении....
Возникли вопросы: 1. Можно ли скомпилировать (собрать, склеить) всё в 1 файл? вариант с запаковыванием всего в архив и написания bat-файла для запуска мне не нравится. 2. Возможно ли скрыть командную строку при выполнении программы?
возможно, надо запускать не через php.exe а php-win.exe))) 1-ый вопрос актуален. какой софт посоветуете чтоб сделать нормальный setup, который и раскидает всё по своим местам и ярлычки создаст...
Апдейт. Да простят меня боги, но чтобы не потерялось, позволю себе скопипиздить. источник: http://shecspi.blоgspоt.com/2009/06/аpаchе-1.html Сегодня предлагаю написать программу, которая предоставит пользователю возможность запускать, останавливать и перезапускать веб-сервер Apache. Программа будет отображать значок в системном трее, при нажатии на который правой кнопкой мыши будет отображаться контекстное меню. За отображение иконки в трее отвечает класс GtkStatusIcon: PHP: <?php $tray = new GtkStatusIcon; С помощью метода set_tooltip() можно установить подсказку, которая будет отображаться при наведении указателя мыши на иконку: PHP: <?php $tray->set_tooltip('Программа управления веб-сервером Apache'); Иконку можно установить несколькими способами. Один из них - это взять из предустановленных в PHP-GTK: PHP: <?php $tray->set_from_stock(Gtk::STOCK_EXECUTE); При нажатии правой кнопкой мыши по значку в трее издаётся сигнал 'popup-menu' (в рамки данной статьи это не входит, но я всё же скажу, что при нажатии левой кнопкой издаётся сигнал 'activate'): PHP: <?php $tray->connect('popup-menu', 'on_popup_menu'); Теперь создадим контекстное меню. Оно практически ничем не отличается от обычного, которое находится в верхней части окна. О нём я рассказывал в статьях Часть 1 и Часть 2. Нам только необходимо применить к нему метод popup(). PHP: <?php function on_popup_menu() { $menu = new GtkMenu; $start = new GtkMenuItem('Запустить Apache'); $start->connect_simple('activate', 'apache', 'start'); $menu->append($start); $restart = new GtkMenuItem('Перезапустить Apache'); $restart->connect_simple('activate', 'apache', 'restart'); $menu->append($restart); $stop = new GtkMenuItem('Остановить Apache'); $stop->connect_simple('activate', 'apache', 'stop'); $menu->append($stop); $menu->show_all(); $menu->popup(); } При нажатии на любой пункт меню вызывается функция apache(), которая запускает/перезапускает/останавливает веб-сервер. Команда в exec() может отличаться от приведённой мною в зависимости от ОС и дистрибьютива. В моём случае она подходит для Ubuntu. Обратите внимание, что для выполнения любого действия необходимо наличие прав суперпользователя, поэтому используется команда gksu, которая выводит на экран окно для ввода пароля от root. PHP: <?php function apache($comand) { exec('gksu /etc/init.d/apache2 '.$comand); } Полный код программы: PHP: <?php $tray = new GtkStatusIcon; $tray->set_tooltip('Программа управления веб-сервером Apache'); $tray->set_from_stock(Gtk::STOCK_EXECUTE); $tray->connect('popup-menu', 'on_popup_menu'); Gtk::main(); function on_popup_menu() { $menu = new GtkMenu; $start = new GtkMenuItem('Запустить Apache'); $start->connect_simple('activate', 'apache', 'start'); $menu->append($start); $restart = new GtkMenuItem('Перезапустить Apache'); $restart->connect_simple('activate', 'apache', 'restart'); $menu->append($restart); $stop = new GtkMenuItem('Остановить Apache'); $stop->connect_simple('activate', 'apache', 'stop'); $menu->append($stop); $menu->show_all(); $menu->popup(); } function apache($comand) { exec('gksu /etc/init.d/apache2 '.$comand); } ?>
А ктонить может подсказать как правильно поставить расширение PHP-GTK php_gtk_html2.dll? При запуске ругается на отсутствие gtkhtml-3.0.dll
искал про не устанавливающийся glade-3 наткнулся в поиске на это)))уххх прикольно, чёнить наманьячу на досуге)