Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Библиотека GTK+ создана на базе других библиотек: GLib, Pango, ATK, Cairo и GDK. Она поддерживает неграфические функции (GLib), отображение многоязычных текстов в кодировке UTF-8 (Pango), средства облегчения работы (Atk), графический рендеринг (Cairo), низкоуровневые графические объекты (Gdk), а также множество виджетов и высокоуровневых графических объектов (Gtk).

Во время работы над книгой текущей была версия Ruby/GTK2 0.14.1, совместимая с текущими стабильными версиями Ruby и GTK+ (2.0). Помимо Linux, она поддерживает семейство ОС Windows и Mac OS X (с X Window System). Идет работа по переносу на «родную» платформу Mac OS X, хотя пока эта версия еще не стабильна.

GTK+ — объектно-ориентированная библиотека, поддерживающая логически стройную иерархию виджетов. Классы

Gtk::Bin
и
Gtk::Container
весьма развиты, а комбинация менеджеров размещения
Gtk::Вох
и
Gtk::Table
обеспечивает простые, но в то же время гибкие средства управления геометрией. В Ruby/GTK2 есть удобный механизм установки обработчиков сигналов.

Среди виджетов GTK+ вы найдете меню, панели инструментов, всплывающие подсказки, деревья, индикаторы хода процесса, бегунки и календари. К слабым местам текущей версии GTK+ можно отнести недостаточно богатый набор стандартных диалогов, с которыми к тому же трудно работать в модальном режиме. Есть недостатки и у стандартного многострочного текстового редактора.

Все строки, передаваемые методам Ruby/GTK2, должны быть представлены в кодировке UTF-8. Нельзя употреблять не ASCII-символы из некоторых одно- или многобайтовых кодовых страниц Windows. Поэтому не забывайте при редактировании Ruby-сценариев переключать редактор в режим UTF-8 и помещайте предложение

$KCODE="U"
в начале сценария.

12.2.2. Простое оконное приложение

Любая программа, в которой используется Ruby/GTK2, должна содержать директиву

require "gtk2"
. Функциональность Ruby/GTK2 предоставляется посредством модулей
Gtk
и
Gdk
, поэтому имена классов GTK+ обычно начинаются с префикса
Gtk::
или
Gdk::
.

Как правило, для инициализации Ruby/GTK2 мы вызываем метод

Gtk.init
, а затем создаем окно верхнего уровня и обработчик сигнала
destroy
(который поступает, когда пользователь закрывает окно). Метод
show_all
делает окно видимым, а обращение к
Gtk .main
запускает цикл обработки событий.

Мы еще вернемся к этой теме, но сначала рассмотрим пример. Следующий код, как и рассмотренная выше программа для Tk, отображает текущую дату:

$KCODE = "U"

require "gtk2"

Gtk.init

window = Gtk::Window.new("Today's Date")

window.signal_connect("destroy") { Gtk.main_quit }

str = Time.now.strftime("Today is \n%B %d, %Y")

window.add(Gtk::Label.new(str))

window.set_default_size(200, 100)

window.show_all

Gtk.main

О переменной

$KCODE
речь шла в главе 4. Метод
Gtk.init
инициализирует Ruby/GTK2.

Главное окно (типа

Gtk::window
) создается как окно «верхнего уровня», а указанный текст отображается в полосе заголовка.

Далее создается обработчик сигнала

destroy
, который посылается при закрытии главного окна. Этот обработчик (в данном случае один блок) просто завершает главный цикл обработки событий. В документации по Ruby/GTK2 перечислены все сигналы, которые могут поступать каждому виджету (не забудьте и о суперклассах). Обычно они генерируются в результате манипуляций с мышью и клавиатурой, срабатывания таймеров, изменений состояния окна и т.д.

В следующей строке мы добавляем метку прямо в главное окно. Размер метки вычисляется автоматически на основе длины текста.

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

set_default_size
мы говорим, что начальный размер главного окна должен составлять 200x100 пикселей.

Затем мы вызываем метод

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

Метод

Gtk.main
запускает цикл обработки событий в GTK+. Он не возвращает управления, пока приложение не завершится. В данном случае обработчик события
destroy
приводит к выходу из
Gtk.main
, после чего завершается и все приложение.

12.2.3. Кнопки

Для создания кнопки в Ruby/GTK2 предназначен класс

Gtk::Button
. В простейшем случае мы задаем обработчик события
clicked
, которое возникает, когда пользователь щелкает по кнопке.

Программа в листинге 12.5 позволяет ввести одну строку в текстовое поле и после нажатия кнопки All Caps! преобразует ее в верхний регистр. На рис. 12.4 показано текстовое поле до нажатия кнопки.

Листинг 12.5. Кнопки в GTK

$KCODE = "U"

require "gtk2"

class SampleWindow < Gtk::Window

def initialize

 super("Ruby/GTK2 Sample")

 signal_connect("destroy") { Gtk.main_quit }

 entry = Gtk::Entry.new

 button = Gtk::Button.new("All Caps!")

 button.signal_connect("clicked") {

Поделиться:
Популярные книги

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Газлайтер. Том 21

Володин Григорий Григорьевич
21. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 21

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Законы Рода. Том 7

Мельник Андрей
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Техник-ас

Панов Евгений Владимирович
Фантастика:
боевая фантастика
5.00
рейтинг книги
Техник-ас

Беглый

Шимохин Дмитрий
2. Подкидыш [Шимохин]
Приключения:
прочие приключения
5.00
рейтинг книги
Беглый

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7