Автор: Сергей Иванов

3 февраля 2007г.

Jabber: linuxural@jabber.ru


Первая программа с использованием GTK 2

Введение

    Вообще то меня можно осудить за то что сам только начинаю изучение GTK и уже пытаюсь «научить» других но всё же дума, что данная статья принесёт пользу нежели вред. Дело в том, что при изучении чего то нового всегда возникает множество вопросов на которые приходится искать ответы из разных источников, иногда ответ находится быстро, иногда его долго не удаётся найти на поставленный вопрос.

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

    Когда я учился писать программы в Delphi я начинал с программ шуток. Благо русскоязычной информации по этому много, много так же и исходников-примеров. От простого к сложному я перешёл тогда когда понял как всё взаимодействует и работает. По такому же принципу я смог быстро освоить C++ и PHP.

    Но вот понадобилось мне научится писать программы под Linux (разумеется с GUI) и я решил пойти по такому же принципу, думал что получится стал искать статьи, исходники и к своему удивлению ничего подходящего не нашёл.

    Конечно есть куча исходников но разобраться в них не просто. Есть так же и статьи по этому поводу, но вот шуточных, простеньких примерчиков с пошаговым описанием я не нашёл, поэтому собственно говоря и решил написать данную статью.

О программе

    У многих первой работающей программой становится Hello World!, мне как то удалось избежать этого, моя первая программа была программой-шуткой (летающая кнопка «Пуск» в офф-топике). В Linux прямого аналога этой кнопки нет, да и вообще это зависит от оконного менеджера. Поэтому я решил написать другую программу-шутку.

    Суть программы: окно, на нём 2 кнопки (да/нет) и надпись задающая вопрос (Довольны ли вы вашей зарплатой?). При попытке нажатия на кнопку «нет» она «убегает» от мышки, можно нажать только нажать «да», при этом появится информационный диалог с надписью (Мы и не сомневались :)), и кнопкой «ОК» после нажатия на которую программа завершает свою работу.

Используемые программы

Для создания программы использовались :

Примечание: перечислен не все программы и утилиты.

Создания проекта

    Откройте «Терминал» напишите LANGUAGE=C и в нём же запустите аnjuta (это нужно для того что бы программа использовала интерфейс на английском языке), сделано это для удобства объяснений (перевод может отличая).

    Создайте новый проект (File->New Project), появится окно «Application Wizard» с тремя кнопками «Cancel, Back, Forward» нажмите «Forward»

    На странице «Project Type» выберите «GTK 2.0 project» и снова нажмите «Forward».

    Появится страница «Basic Information», на ней вы должны указать название проекта для этого в поле (Project Name) укажите его названия, для примера назовите проект «pay». Поле (Project Version) оставьте без изменения, в поле (Project Autor) укажите своё имя и фамилию, поле (Project Target) оставьте без изменения.

    Нажмите ещё раз «Forward», появится страница «Project Description» (Описания проекта), оставьте всё без изменений и жмите «Forward», на странице «Additional Options» так же оставите всё без изменений и ещё раз нажмите «Forward», после этого появится страница «Summary» (рисунок 1) на ней нажмите «Apply», после этого произойдёт создания проекта и генерации кода.

Рис 1

Summary





Компиляция и первый запуск

    Если всё прошло успешно то прежде чем продолжить, стоит попробовать откомпилировать и запустить программу. С начало откомпилируйте (Build-> Build All) или нажмите Shift+F11. Если компиляция прошла успешно то запустите программу (Build->Execute) или нажмите F3, после этого должно появится пустое окно, закройте его.

    Если же возникли ошибки то возможно, что в вашей системе чего то не хватает. Посмотрите сообщения об ошибках, проанализируйте их, если будет не понят в чем дело то попробуйте спросить на форуме или поищите в google.ru.

Создания интерфейса

    Нажмите редактирования интерфейса (Project->Edit Application GUI) или Alt+G (рекомендую привыкнуть к использованию горячих клавиш). После этого откроется glade и в нём можно будет создавать интерфейс для программы, дальше речь пойдёт о glade.

    Glade содержит окна: Glade (главное окно), Properties, Widget Tree, Clipboard, Pallete (содержит список виджетов) – если какое либо из этих окон будет закрыто (кроме главного) то для того, что бы его увидеть нажмите в меню главного окна (View-> Show имя окна).

    Выберите главное окно и в нем дважды кликните на window1 (так же можно выбрать Widget Tree в нём кликнуть правой кнопкой мыши на window1 и в всплывающем меню выбрать «Redisplay») после этого появится window1 (как раз то окно которое показывается при нажатии F3 в anjuta), его и нужно отредактировать должным образом.

    С окна «Pallete» на «window1» «кинте» виджет «Fixed Positions», для этого кликните сначала на «Fixed Positions», а потом на «window1», таким же образом поместите на «Fixed Positions» две кнопки (Button) и одну метку (Label).

    Кликните на button1 и в окне «Properties» в поле «Label» вместо button1 напишите «Да», для button2 исправьте на «Нет», а для label1 исправьте на «Довольны ли вы вашей зарплатой?». Не убирая выделения с label1 перейдите с вкладке «Widget» на вкладку «Common» и увеличьте свойство «Width» для того, что бы надпись на метке полностью входила (я сделал 280).

    Снова выберите button2 и на вкладке «Common» сделайте свойство Can Focus=No. Перейдите на вкладку «Signals» и добавьте сигнал «enter», а в качестве «Object» впешите «window1», затем нажмите добавить (Add).

    Аналогично для button1 создайте сигнал «clicked», так же в качестве «Object» укажите «window1» и нажмите добавить (Add). Пример смотрите на рисунке 2.

    В «Widget Tree» кликните на «window1», в «Properties» на вкладке «Common» установите значения Width=500, Height=400 перейдите на вкладку «Widget» измените свойство «Title» на «Вопрос о зарплате». Свойство Resizable=No, снимите галочки c «Default Width» и «Default Height», Position=Center Разместите виджеты как показано на рисунке 3.

    После того как вы всё сделаете, сохраните проект (Project->Save) или Ctrl+S, и с генерируйте код (Project->Build) или Ctrl-B.

    Можно закрыть glade (оно больше не понадобится) и перейти в anjuta, для создания исходного кода.

Рис 2

Signal

Рис 3

Вопрос о зарплате

Создания исходного кода

    В «Project window» кликните дважды по файлу «callbacks.c» (окно «Project window» можно увидеть/спрятать при нажатии на Ctrl+F2). После этого откроется исходник содержащий сигналы (которые были созданы в glade)

    С начало опишем сигнал для кнопки «Да» (button1), для этого необходимо написать между фигурных скобок следующий код:

GtkWidget *dialog;

         dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Мы и не сомнивались :)");
gtk_dialog_run(GTK_DIALOG (dialog)); //показать диалог.
gtk_widget_destroy(dialog); //уничтожить диалог.
gtk_main_quit(); //завершить программу.

А затем для кнопки «нет» (button2):

         GtkWidget *link;  
gint x, y;
x = g_random_int() % 437; //500 - 64 + 1 = 437
y = g_random_int() % 337; //400 - 64 + 1 = 337
link = lookup_widget(GTK_WIDGET(user_data), "button2");
gtk_widget_set_uposition(GTK_WIDGET(link), x, y);

    После этого проект необходимо сохранить (Ctrl+S), откомпилировать (Shift+F11), и наконец запустить (F3).

    При нажатии на кнопку «Да» будет показан диалог, а попытка нажать на кнопку «Нет» приведёт к тому, что кнопка будет убегать от курсора мыши. Так же не получится нажать на неё при помощи клавиатуры так как в свойстве button2 было указано Can Focus=No.

Скачать исходники (130 Кб)
Скачать бинарный файл (16 Кб)
Скачать эту статью в PDF (231 Кб)


Рейтинг@Mail.ru