За последние 24 часа нас посетили 17780 программистов и 1654 робота. Сейчас ищут 1584 программиста ...

Установка, использование PHP-GTK2 (GUI пакет)

Тема в разделе "Установка PHP", создана пользователем admyx, 12 фев 2009.

  1. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Плохому магу тедди бир мешает (с)

    Пакет 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):
    1. php_gtk_sourceview2.dll
    2. php_gtk_scintilla2.dll
    3. php_gtk_libglade2.dll
    4. php_gtk_html2.dll
    Стандартных (типа mysql, bz2) там нет. Их нужно ставить отдельно. Как это сделать, я опишу позже. А пока...

    2. Распаковываем в любую папку на диске C:\.
    Открываем файл php-cli.ini
    Все, что в нем есть - это настройки для php-gtk. Вы можете указать любые настройки между секциями
    PHP:
    1.  и [PHP-GTK].
    2.  
    3. [b]3.[/b] Запускается пакет путем указания пути к интерпретатору и к скрипту.
    4. С php-gtk поставляется стандартное демо, которое находится по адресу \demos\phpgtk2-demo.php/
    5. Я запускаю из командной строки - C:\php-gtk2\php-win.exe C:\php-gtk2\demos\index.php
    6.  
    7. [b]4.[/b] Думаю, Вам все равно потребуются стандартные расширения, но их установка может вызвать проблему.
    8. Хех.. И ошибку типа этой:
    9. [quote]"PHP Warning: PHP Startup: mysql: Unable to initialize module
    10. Module compiled with module API=20060613, debug=0, thread-safety=1
    11. PHP compiled with module API=20060613, debug=0, thread-safety=0
    12. These options need to match
    13. in Unknown on line 0" [/quote]
    14. Это означает, что текущему билду php-gtk необходимы расширения и php, скомпилированные без опции thread-safety.
    15. Эта проблема решается скачиванием и установкой пакета "PHP 5.2.8 Non-thread-safe zip package"
    16. Взять можно отсюда - [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]
    17. После скачивания кидаем все файлы из папки /ext/ в папку ext нашего php-gtk, а корневые lib*.dll в корень php-gtk.
    18.  
    19. [b]5.[/b] Теперь все, что осталось - добавить в наш php-cli.ini строчки с расширениями - etc.
    20.  
    21. [quote]extension=php_bz2.dll
    22. extension=php_curl.dll[/quote]
    23.  
    24. Также, имеет смысл описать в php.ini настройки, специфичные для каждого модуля - для этого можно взять любой рабочий php ini и скопировать секцию настроек модуля в наш php-cli.ini  - etc.
    25. [quote][size=2][MySQL]
    26. ; Allow or prevent persistent links.
    27. mysql.allow_persistent = On
    28.  
    29. ; Maximum number of persistent links.  -1 means no limit.
    30. mysql.max_persistent = -1
    31.  
    32. ; Maximum number of links (persistent + non-persistent).  -1 means no limit.
    33. mysql.max_links = -1
    34.  
    35. ; Default port number for mysql_connect().  If unset, mysql_connect() will use
    36. ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
    37. ; compile-time value defined MYSQL_PORT (in that order).  Win32 will only look
    38. ; at MYSQL_PORT.
    39. mysql.default_port = 3306
    40.  
    41. ; Default socket name for local MySQL connects.  If empty, uses the built-in
    42. ; MySQL defaults.
    43. mysql.default_socket =
    44.  
    45. ; Default host for mysql_connect() (doesn't apply in safe mode).
    46. mysql.default_host =
    47.  
    48. ; Default user for mysql_connect() (doesn't apply in safe mode).
    49. mysql.default_user = root
    50.  
    51. ; Default password for mysql_connect() (doesn't apply in safe mode).
    52. ; Note that this is generally a *bad* idea to store passwords in this file.
    53. ; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password")
    54. ; and reveal this password!  And of course, any users with read access to this
    55. ; file will be able to reveal the password as well.
    56. mysql.default_password = 1
    57.  
    58. ; Maximum time (in seconds) for connect timeout. -1 means no limit
    59. mysql.connect_timeout = 60
    60.  
    61. ; Trace mode. When trace_mode is active (=On), warnings for table/index scans and
    62. ; SQL-Errors will be displayed.
    63. mysql.trace_mode = Off[/size][/quote]
    64.  
    65. Собственно, все. После этих действий у меня заработал php-gtk с расширениями.
    66. А посмотреть, какие расширения загружены, можно ф-ей extension_loaded() - [url=http://php.ru/manual/function.extension-loaded.html]http://php.ru/manual/function.extension-loaded.html[/url]
    67.  
    68. [b]6.[/b] Ссылки
    69. Документация php gtk  - [url=http://gtk.php.net/docs.php]http://gtk.php.net/docs.php[/url]
    70. Загрузка php gtk - [url=http://gtk.php.net/download.php]http://gtk.php.net/download.php[/url]
    71. Основное сообщество - [url=http://www.php-gtk.eu/]http://www.php-gtk.eu/[/url]
    72. Разработчик интерфесов - [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]
    73.  
    74. [u]p.s.[/u]
    75. Что хочется добавить - при возникновении ошибки программа дохнет, не выкидывая окна с предупреждениями, поэтому имеет смысл проверять на существование переменных (ф-й, классов), и может быть, вести лог. Но, здесь уже на вкус и цвет...
     
  2. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Вот, например, код очень простого скрипта на phpgtk, позволяющего соединиться с mysql-сервером и узнать информацию о введенной таблице.

    Требуемые расширения: mysqli
    Кодовая страница: utf8

    PHP:
    1.  
    2. <?php
    3.  
    4. if (!class_exists('gtk')) {
    5.     die("Please load the php-gtk2 module in your php.ini\r\n");
    6. }
    7.  
    8. /**
    9. *
    10. *   @param GtkWindow $wnd           Основное окно логина
    11. *
    12. *   @param GtkEntry $txtUsername    Поле ввода имени пользователя
    13. *   @param GtkEntry $txtPassword    Поле ввода пароля
    14. *   @param GtkEntry $txtTable       Таблица, о которой будет запрашиваться информация
    15. */
    16. function login(GtkWindow $wnd, GtkEntry $txtUsername, GtkEntry $txtPassword, GtkEntry $txtTable)
    17. {
    18.     //Получаем введенные данные - логин, пароль и таблицу
    19.     $strUsername = $txtUsername->get_text();
    20.     $strPassword = $txtPassword->get_text();
    21.     $strTable   =   $txtTable->get_text();
    22.  
    23.     //Проверяем, не пусты ли поля
    24.     $errors = null;
    25.     if (empty($strUsername))
    26.     {
    27.         $errors .= "Вы не ввели логин.\r\n";
    28.     }
    29.     if (empty($strTable))
    30.     {
    31.         $errors .= "Вы не ввели низвание таблицы.\r\n";
    32.     }
    33.  
    34.     //Если есть ошибки
    35.     if (!empty($errors))
    36.     {
    37.         //Показываем диалоговое окно с ошибками
    38.         $dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL,
    39. Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors);
    40.         $dialog->set_markup(
    41.             "Найдены ошибки:\r\n"
    42.             . "<span foreground='red'>" . $errors . "</span>"
    43.         );
    44.         $dialog->run();
    45.         $dialog->destroy();
    46.     }
    47.     else
    48.     {
    49.             //иначе соединяемся с БД
    50.             $conn = new mysqli('localhost', $strUsername, $strPassword, $strTable);
    51.             if(!mysqli_connect_errno())
    52.             {
    53.                 //получаем информацию о таблице
    54.                 $q = 'DESCRIBE '.$strTable;
    55.                 $r = $conn->query($q);
    56.                 $message = null;
    57.                
    58.                 $message .= "Соединение установлено\r\n";
    59.                
    60.                 while($s = $r->fetch_assoc())
    61.                     $message .= print_r($s, 1);
    62.                
    63.                 $conn->close();
    64.             }
    65.             else $message = "Нет соединения с БД.\r\nПроверьте, правильно ли указаны параметры.";
    66.  
    67.         //Выводим диалоговое окно
    68.         $dialog = new GtkMessageDialog($wnd, Gtk::DIALOG_MODAL,
    69. Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, $errors);
    70.         $dialog->set_markup($message);
    71.         $dialog->run();
    72.         $dialog->destroy();
    73.     }
    74. }
    75.  
    76. //Создаем диалоговое окно
    77. $wnd = new GtkWindow();
    78. $wnd->set_title('Подключение к серверу');
    79. //Создаем кнопку
    80. $wnd->connect_simple('destroy', array('gtk', 'main_quit'));
    81.  
    82.  
    83. //Создаем винжеты
    84. $lblCredit   = new GtkLabel("Подключение к серверу mysql\r\nи получение информации о таблице.");
    85. //Второй параметр указывает, что символы с подчеркиванием нужно парсить
    86. $lblUsername = new GtkLabel('_Имя пользователя', true);
    87. $lblPassword = new GtkLabel('_Пароль', true);
    88. $lblTable   =   new GtkLabel('_Имя таблицы', true);
    89. $txtUsername = new GtkEntry();
    90. $txtPassword = new GtkEntry();
    91. $txtTable = new GtkEntry();
    92. $btnLogin    = new GtkButton('_Логин');
    93. $btnCancel   = new GtkButton('_Выход');
    94.  
    95.  
    96. //Какая кнопка должна срабатывать по нажатию (Alt+U или Alt+P)?
    97. $lblUsername->set_mnemonic_widget($txtUsername);
    98. $lblPassword->set_mnemonic_widget($txtPassword);
    99. $lblTable->set_mnemonic_widget($txtTable);
    100.  
    101. //Уничтожаем окно, если нажат cancel
    102. /*Синтаксис ф-ии
    103. GObject::connect_simple
    104.  
    105. int connect_simple(string signal, callback callback [, mixed userparam]);
    106. */
    107.  
    108. $btnCancel->connect_simple('clicked', array($wnd, 'destroy'));
    109. //ВЫзываем фунцию  'login' если нажат логин. После указания окна - идут пользовательские параметры
    110. $btnLogin->connect_simple('clicked', 'login', $wnd, $txtUsername, $txtPassword, $txtTable);
    111.  
    112.  
    113. //Размещаем наши кнопки на таблице
    114. /* Конструктор
    115. GtkTable ([int n_rows = 1 [, int n_columns = 1 [, bool homogeneous = false]]]);
    116. */
    117. $tbl = new GtkTable(4, 3);
    118.  
    119. /*Синтаксис ф-ии
    120. GtkTable::attach
    121.  
    122. void attach(GtkWidget child, int left_attach, int right_attach, int top_attach, int bottom_attach
    123. [, GtkAttachOptions xoptions = Gtk::EXPAND|Gtk::FILL [, GtkAttachOptions yoptions = Gtk::EXPAND|Gtk::FILL
    124. [, int xpadding = Gtk::EXPAND|Gtk::FILL [, int ypadding = Gtk::EXPAND|Gtk::FILL]]]]);
    125. */
    126.  
    127. $tbl->attach($lblCredit, 0, 2, 0, 1);
    128. $tbl->attach($lblUsername, 0, 1, 1, 2);
    129. $tbl->attach($txtUsername, 1, 2, 1, 2);
    130. $tbl->attach($lblPassword, 0, 1, 2, 3);
    131. $tbl->attach($txtPassword, 1, 2, 2, 3);
    132. $tbl->attach($lblTable,    0, 1, 3, 4);
    133. $tbl->attach($txtTable,    1, 2, 3, 4);
    134.  
    135. //Добавляем кнопки на сетку кнопок
    136. $bbox = new GtkHButtonBox();
    137. $bbox->set_layout(Gtk::BUTTONBOX_EDGE);
    138. $bbox->add($btnCancel);
    139. $bbox->add($btnLogin);
    140.  
    141.  
    142. //Добавляем таблицу в окно
    143. $vbox = new GtkVBox();
    144. $vbox->pack_start($tbl);
    145. $vbox->pack_start($bbox);
    146.  
    147. $wnd->add($vbox);
    148.  
    149. //Показываем все кнопки
    150. $wnd->show_all();
    151. //Запускаем программу и ожидаем действий пользователя
    152. Gtk::main();
    153. ?>
    154.  
     
  3. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    установка на *nix:
    1. качаем исходники http://gtk.php.net/download.php
    2. распаковываем
    3.
    Код (Text):
    1. $ ./buildconf && ./configure && make
    4.
    Код (Text):
    1. # make install
    5. добавляем в php.ini
    Код (Text):
    1. extension=php_gtk2.so
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Хотелось бы добавить к предыдущему посту - phpGtk, по-видимому, не работает под FreeBsd.

    Цитата из документации:
    Лично я подозреваю, что если под Фрей поставить эмулятор linux, и из-под него запускать phpGtk, то вполне вероятно, что все заработает. Так, например, под фрей запускается сервер counter-strike. Но на практике не проверял)
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    admyx
    под FreeBSD 7.1 собралось и работает ;)
     
  6. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Ну вот))) Значит, работает))

    А собирал как?
    Качал исходники или есть в портах?
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    эмм, а в итоге получается exe? Можно примеры готовых приложений?
     
  8. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Не хочу создавать холивар, но ИМХО оконные приложения на PHP это жесть, проще на минимальном уровне JAVA SE прокурить, за пару дней простенькое оконное приложение без проблем напишешь)
     
  9. ИМХО имеет аргументацию?
     
  10. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    ИМХО под десктоп в той JAVA SE и C++ несравнимо просто больше документации
    ИМХО также несравнимо больше коммьюнити
    ИМХО нужно меньше изобретать велосипедов.
    ИМХО молоток крутая тема для заколачивания гвоздей, при желании можно забивать гвоздь, потом снова доставать, при большой практике можно делать в стенках дырки нужного размера. Но дрелью это будет куда быстрее, удобнее и приятнее.
     
  11. Ты не менеджер, а я не клиент. не надо меня парить размерами коммюнити. У GNOME коммюнити ничуть не меньше. А GNOME == GTK.

    Не слышу обьективной аргументации.
     
  12. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    в портах есть только для php4, собирал как описал выше
     
  13. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Поищи в Гугле документацию по PHP-GTK.
    А теперь для JAVA SE.

    Для меня это серьезный аргумент.

    Впрочем на вкус и цвет все фломастеры разные.
     
  14. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Да нет не плоха, просто эта мне куда больше нравится. Вообще у сановцев приятная документация.
    И на этом сайте можно больше инфы найти по AWT или Swing чем на том же phpclub.ru по PHP-GTK.

    Знаешь, иногда очень приятно, что можно, задать вопрос и тебе ответят. То что найду форум где мне ответят на насущный вопрос по AWT или по Swing я уверен. А вот то что мне помогут также по PHP-GTK очень сомневаюсь...
     
  15. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Нет, в итоге получается php-файл, запускаемый с помощью php-win.exe, как я описал выше.
    Рабочий пример программы - выше.

    Парни, я ж просил -
    это понятно, что есть дельфи, с и ява. Но есть и phpGtк. Лично мне удобнее писать приложения с помощью php.
    А рассуждать на эту тему - есть холивар чистейшей воды, и все равно каждый останется при своем мнении....
     
  16. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    Возникли вопросы:
    1. Можно ли скомпилировать (собрать, склеить) всё в 1 файл? вариант с запаковыванием всего в архив и написания bat-файла для запуска мне не нравится.
    2. Возможно ли скрыть командную строку при выполнении программы?
     
  17. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    возможно, надо запускать не через php.exe а php-win.exe)))
    1-ый вопрос актуален. какой софт посоветуете чтоб сделать нормальный setup, который и раскидает всё по своим местам и ярлычки создаст...
     
  18. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Апдейт.
    Да простят меня боги, но чтобы не потерялось, позволю себе скопипиздить.

    источник: http://shecspi.blоgspоt.com/2009/06/аpаchе-1.html


    Сегодня предлагаю написать программу, которая предоставит пользователю возможность запускать, останавливать и перезапускать веб-сервер Apache. Программа будет отображать значок в системном трее, при нажатии на который правой кнопкой мыши будет отображаться контекстное меню.

    За отображение иконки в трее отвечает класс GtkStatusIcon:

    PHP:
    1. <?php
    2. $tray = new GtkStatusIcon;


    С помощью метода set_tooltip() можно установить подсказку, которая будет отображаться при наведении указателя мыши на иконку:

    PHP:
    1. <?php
    2. $tray->set_tooltip('Программа управления веб-сервером Apache');


    Иконку можно установить несколькими способами. Один из них - это взять из предустановленных в PHP-GTK:

    PHP:
    1. <?php
    2. $tray->set_from_stock(Gtk::STOCK_EXECUTE);


    При нажатии правой кнопкой мыши по значку в трее издаётся сигнал 'popup-menu' (в рамки данной статьи это не входит, но я всё же скажу, что при нажатии левой кнопкой издаётся сигнал 'activate'):

    PHP:
    1. <?php
    2. $tray->connect('popup-menu', 'on_popup_menu');
    3.  

    Теперь создадим контекстное меню. Оно практически ничем не отличается от обычного, которое находится в верхней части окна. О нём я рассказывал в статьях Часть 1 и Часть 2. Нам только необходимо применить к нему метод popup().

    PHP:
    1. <?php
    2. function on_popup_menu()
    3. {
    4.     $menu = new GtkMenu;
    5.  
    6.     $start = new GtkMenuItem('Запустить Apache');
    7.     $start->connect_simple('activate', 'apache', 'start');
    8.     $menu->append($start);
    9.     $restart = new GtkMenuItem('Перезапустить Apache');
    10.     $restart->connect_simple('activate', 'apache', 'restart');
    11.     $menu->append($restart);
    12.     $stop = new GtkMenuItem('Остановить Apache');
    13.     $stop->connect_simple('activate', 'apache', 'stop');
    14.     $menu->append($stop);
    15.  
    16.     $menu->show_all();
    17.     $menu->popup();
    18. }
    19.  

    При нажатии на любой пункт меню вызывается функция apache(), которая запускает/перезапускает/останавливает веб-сервер. Команда в exec() может отличаться от приведённой мною в зависимости от ОС и дистрибьютива. В моём случае она подходит для Ubuntu. Обратите внимание, что для выполнения любого действия необходимо наличие прав суперпользователя, поэтому используется команда gksu, которая выводит на экран окно для ввода пароля от root.

    PHP:
    1. <?php
    2. function apache($comand)
    3. {
    4.     exec('gksu /etc/init.d/apache2 '.$comand);
    5. }
    6.  

    Полный код программы:
    PHP:
    1.  
    2. <?php
    3.  
    4. $tray = new GtkStatusIcon;
    5. $tray->set_tooltip('Программа управления веб-сервером Apache');
    6. $tray->set_from_stock(Gtk::STOCK_EXECUTE);
    7. $tray->connect('popup-menu', 'on_popup_menu');
    8. Gtk::main();
    9.  
    10. function on_popup_menu()
    11. {
    12.     $menu = new GtkMenu;
    13.  
    14.     $start = new GtkMenuItem('Запустить Apache');
    15.     $start->connect_simple('activate', 'apache', 'start');
    16.     $menu->append($start);
    17.     $restart = new GtkMenuItem('Перезапустить Apache');
    18.     $restart->connect_simple('activate', 'apache', 'restart');
    19.     $menu->append($restart);
    20.     $stop = new GtkMenuItem('Остановить Apache');
    21.     $stop->connect_simple('activate', 'apache', 'stop');
    22.     $menu->append($stop);
    23.  
    24.     $menu->show_all();
    25.     $menu->popup();
    26. }
    27.  
    28. function apache($comand)
    29. {
    30.     exec('gksu /etc/init.d/apache2 '.$comand);
    31. }
    32.  
    33. ?>
     
  19. memphis187

    memphis187 Активный пользователь

    С нами с:
    2 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    А ктонить может подсказать как правильно поставить расширение PHP-GTK php_gtk_html2.dll? При запуске ругается на отсутствие gtkhtml-3.0.dll
     
  20. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    искал про не устанавливающийся glade-3 наткнулся в поиске на это)))уххх прикольно, чёнить наманьячу на досуге)
     
  21. Интуит

    Интуит Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    50
    Симпатии:
    0
    Адрес:
    Из Волжского
    PHP Devel Studio круче, чем PHP-GTK.