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

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

Жанры

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

В данном случае мы хотим воспользоваться шрифтом из семейства Times; на платформе Windows мы, скорее всего, получим какой-то вариант шрифта Times Roman. В ОС Linux/UNIX параметром должна быть стандартная для X Window System строка указания шрифта. Система вернет шрифт, наиболее близкий к заданному.

Метка

@status
первоначально пуста. Ее текст будет изменен позже.

GTK+ предлагает два способа добавить полосы прокрутки. Можно напрямую создать объект

Gtk::ScrollBar
и с помощью сигналов синхронизировать его с ассоциированным виджетом. Но в большинстве случаев проще воспользоваться виджетом
Gtk::ScrolledWindow
.

Виджет

Gtk::ScrolledWindow
наследует
Gtk::Bin
, поэтому может содержать только один дочерний виджет. Но этот виджет может принадлежать классу
Gtk::Вох
или любому другому контейнеру, допускающему несколько потомков. Ряд виджетов GTK+, в том числе и
Gtk::TextView
, автоматически взаимодействуют с
Gtk::ScrolledWindow
, не требуя почти никакого дополнительного кода.

В данном примере мы создали виджет

Gtk::ScrolledWindow
с именем
scroller
и сконфигурировали его методом
set_policy
. Мы решили не отображать горизонтальную полосу прокрутки вовсе, а вертикальную — только тогда, когда в редакторе больше строк, чем видно в окне. Сам текстовый редактор сделан непосредственным потомком
scroller
.

Теперь надо настроить контейнер

Gtk::Vbox
, который расположит наши виджеты по вертикали. Сначала добавляется прокручиваемое окно, содержащее поле ввода, поэтому оно окажется самым верхним. Метка
@status
располагается под ним. Напоследок сам контейнер добавляется в главное окно.

В следующих четырех строчках в поле ввода добавляется текст. В первой строчке мы получаем объект

Gtk::TextIter
, соответствующий началу текста (offset = 0), и вставляем в это место строку. Поскольку до этого момента никакого текста в поле еще не было, только сюда и можно его вставить. Затем вставляется другой кусок текста со смещением 5. В результате редактор будет содержать строку
This really is an editor
.

Поскольку мы предварительно установили обработчик события

changed
, он будет вызываться после каждого обращения к
insert
. Следовательно, статус будет отображаться правильно, несмотря на то что пользователь еще не вносил никаких изменений в текст.

12.2.5. Прочие виджеты

Даже для организации сравнительно простого графического интерфейса текстовых полей и кнопок может оказаться недостаточно. Нужны переключатели, флажки и другие виджеты. В следующем примере демонстрируются некоторые из них.

В листинге 12.7 предполагается, что пользователь хочет заказать билет на самолет. Для выбора города назначения используются классы

Gtk::TreeView
,
Gtk::ListStore
и
Gtk::TreeViewColumn
(многоколонный список). Флажок (класс
Gtk::CheckButton
) определяет, нужен ли обратный билет, а переключатель (класс
Gtk::RadioButton
) позволяет указать класс салона. Завершает интерфейс кнопка
Purchase
(Заказать) — рис. 12.6.

Листинг 12.7. Заказ билета на самолет

$KCODE = "U"

require "gtk2"

class TicketWindow < Gtk::Window

 def initialize

super("Purchase Ticket")

signal_connect("destroy") { Gtk.main_quit }

dest_model = Gtk::ListStore.new(String, String)

dest_view = Gtk::TreeView.new(dest_model)

dest_column = Gtk::TreeViewColumn.new("Destination",

Gtk::CellRendererText.new,

:text => 0)

dest_view.append_column(dest_column)

country_column = Gtk::TreeViewColumn.new("Country",

Gtk::CellRendererText.new,

:text => 1)

dest_view.append_cоlumn(country_cоlumn)

dest_view.selection.set_mode(Gtk::SELECTION_SINGLE)

[["Cairo", "Egypt"], ["New York", "USA"],

["Tokyo", "Japan"]].each do |destination, country|

iter = dest_model.append

iter[0] = destination

iter[1] = country

end

dest_view.selection.signal_connect("changed") do

@city = dest_view.selection.selected[0]

end

@round_trip = Gtk::CheckButton.new("Round Trip")

purchase = Gtk::Button.new("Purchase")

purchase.signal_connect("clicked") { cmd_purchase }

@result = Gtk::Label.new

@coach = Gtk::RadioButton.new("Coach class")

@business = Gtk::RadioButton.new(@coach, "Business class")

@first = Gtk::RadioButton.new(@coach, "First class")

flight_box = Gtk::VBox.new

flight_box.add(dest_view).add(@round_trip)

seat_box = Gtk::VBox.new

seat_box.add(@coach).add(@business).add(@first)

top_box = Gtk::HBox.new

top_box.add(flight_box).add(seat_box)

main_box = Gtk::VBox.new

main_box.add(top_box).add(purchase).add(@result)

add(main_box)

show_all

 end

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

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Неудержимый. Книга XXXII

Боярский Андрей
32. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXXII

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

Измена дракона. Развод неизбежен

Гераскина Екатерина
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Измена дракона. Развод неизбежен

Мастер 6

Чащин Валерий
6. Мастер
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 6

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Мой муж – чудовище! Изгнанная жена дракона

Терин Рем
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Мой муж – чудовище! Изгнанная жена дракона

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

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

Первый среди равных. Книга VII

Бор Жорж
7. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга VII

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Виконт. Книга 3. Знамена Легиона

Юллем Евгений
3. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Виконт. Книга 3. Знамена Легиона