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

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

Жанры

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

entry.text = entry.text.upcase

 }

 box = Gtk::HBox.new

 box.add(Gtk::Label.new("Text:"))

 box.add(entry)

 box.add(button)

 add(box) show_all

 end

end

Gtk.init

SampleWindow.new

Gtk.main

Рис. 12.4.

Пример простой кнопки в GTK

В листинге 12.5 определен класс

SampleWindow
; при таком подходе класс может управлять собственным отображением и поведением (не заставляя вызывающую программу конфигурировать окно). Класс главного окна наследует
Gtk::window
.

Как и в примере «Текущая дата», обработчик сигнала destroy завершает цикл обработки событий после закрытия главного окна.

Этот класс создает однострочное поле ввода (класс

Gtk::Entry
) и кнопку
Gtk::Button
с текстом
All Caps!
. С кнопкой связан обработчик события
clicked
, которое генерируется, когда пользователь нажимает и отпускает кнопку мыши, в то время как ее указатель находится над кнопкой.

Класс

Gtk::Window
— производный от
Gtk::Bin
, поэтому может содержать только один дочерний виджет. Чтобы добавить в окно два виджета, мы сначала помещаем их в контейнер
HBox
, который, в свою очередь, делаем потомком главного окна. Виджеты, добавляемые в контейнер
Gtk::НВох
, по умолчанию размещаются начиная с его правой границы. Есть также контейнер
Gtk::VBox
, который упаковывает своих потомков по вертикали.

Как и раньше, чтобы главное окно (и все его потомки) стало видимым, необходимо вызвать метод

show_all
.

Обработчик события

clicked
вызывается при нажатии кнопки. Он получает текст, находящийся в поле ввода, преобразует его в верхний регистр и записывает обратно в поле ввода.

Собственно код приложения находится после определения класса

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

12.2.4. Текстовые поля

В библиотеке GTK+ есть класс

Gtk::Entry
для ввода одной строки текста — мы видели его в предыдущем примере. Существует также класс
Gtk::Textview
, представляющий собой мощный многострочный редактор; его мы и опишем.

Программа в листинге 12.6 создает многострочное текстовое поле и помещает в него текст. По мере изменения содержимого поля текущая длина текста отображается с помощью метки, расположенной в нижней части окна (рис. 12.5).

Листинг 12.6. Текстовый редактор в GTK

$KCODE = "U"

require "gtk2"

class TextWindow < Gtk::Window

 def initialize

super("Ruby/GTK2 Text Sample")

signal_connect("destroy") { Gtk.main_quit }

set_default_size(200, 100)

@text = Gtk::TextView.new

@text.wrap_mode = Gtk::TextTag::WRAP_WORD

@buffer = @text.buffer

@buffer.signal_connect("changed") {

@status.text = "Length: :" + @buffer.char_count.to_s

}

@buffer.create_tag('notice',

'font' => "Times Bold Italic 18",

'foreground' => "red")

@status = Gtk::Label.new

scroller = Gtk::ScrolledWindow.new

scroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER)

scroller.add(@text)

box = Gtk::VBox.new

box.add(scroller)

box.add(@status)

add(box)

iter = @buffer.start_iter

@buffer.insert(iter, "This is an editor")

iter.offset = 5

@buffer.insert(iter, "really ", "notice")

show_all

 end

end

Gtk.init

TextWindow.new

Gtk.main

Рис. 12.5.

Небольшой текстовый редактор в GTK

Структура программы такая же, как в примере с кнопкой: инициализировать Ruby/GTK2, определить класс главного окна, задать обработчик события, корректно завершающий приложение, и установить начальный размер окна. После

initialize
вызывается метод
show_all
, который делает окно видимым. В последних двух строчках создается окно и запускается цикл обработки событий.

Мы создали виджет редактора с именем

@text
. Включен режим переноса строк, по умолчанию строки разрываются без учета границы слов.

Переменная

@buffer
— это текстовый буфер для виджета
@text
. Мы установили обработчик события
changed
; он будет вызываться при вставке, удалении и изменении текста. Обработчик пользуется методом
char_count
, чтобы узнать текущую длину текста в редакторе и преобразовать ее в строку сообщения. Предложение
@status.text=text
отображает это сообщение в окне.

Далее мы конфигурируем виджет

@text
так, чтобы он показывал текст другим стилем. Для этого с помощью метода
create_tag
создается тег «notice», с которым связан шрифт «Times Bold Italic 18» и красный цвет. Класс
Gtk::TextTag
позволяет задавать и другие свойства тегов.

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

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

Возмездие

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

Законы рода

Андрей Мельник
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Законы рода

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Путешественник по Изнанке

Билик Дмитрий Александрович
4. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
попаданцы
мистика
5.00
рейтинг книги
Путешественник по Изнанке

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога