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

на главную

Жанры

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

 def cmd_purchase

text = @city

if @first.active?

text += ": first class"

elsif

@business.active?

text += ": business class"

elsif @coach.active?

text += ": coach"

end

text += ", round trip " if @round_trip.active?

@result.text = text

 end

end

Gtk.init

TicketWindow.new

Gtk.main

Рис. 12.6.

Различные виджеты GTK

В этом приложении, как и в предыдущих примерах, создается главное окно с обработчиком события. Затем формируется список с двумя колонками, дизайн которого следует паттерну Модель-Вид-Контроллер (Model-View-Controller — MVC); класс

Gtk::ListStore
(модель) имеет две колонки типа
String
.

Далее создается виджет

Gtk::TReeView.
Класс
Gtk::treeViewColumn
конфигурирует эту колонку. Первая колонка называется «Destination», а для отображения клеток применяется класс рисовальщика
Gtk::CellRendererText
. Первая колонка модели (с номером 0) —
Gtk::ListStore
— служит значением текстового свойства. Итак, рисовальщики клеток наполняют древесную модель данными. В GTK+ 2.x есть несколько готовых рисовальщиков клеток, в том числе
Gtk::CellRendererText
,
Gtk::CellRendererPixbuf
и
Gtk::CellRendererToggle
. Далее в список добавляются три строки данных и устанавливается обработчик события
"changed"
, который будет вызываться, когда пользователь выберет другую строку. Этот обработчик изменит значение переменной
@city
, записав в нее текст из первой колонки только что выбранной строки.

Затем создается простой флажок (

Gtk::CheckButton
) и кнопка (
Gtk::Button
). Обработчик события нажатия кнопки вызовет метод
cmd_purchase
. Метка
@result
первоначально пуста, но позже в нее будет записана строка, определяющая вид заказанного билета.

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

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

Gtk::НВох
и
Gtk::VBox
. Список расположен над флажком. Все три переключателя расположены вертикально справа от списка. А кнопка помещена под всеми остальными виджетами.

Метод

cmd_purchase
очень прост: он строит строку, отражающую состояние всех виджетов в момент нажатия кнопки. У переключателей и флажков есть метод
active?
, который возвращает
true
, если виджет отмечен. Построенная строка записывается в метку
@result
и потому появляется на экране.

Во многих приложениях интерфейс содержит меню. В следующем примере показано, как можно организовать меню в Ruby/GTK2. Заодно демонстрируется применение всплывающих подсказок — мелкая деталь, способная украсить любую программу.

В листинге 12.8 создается главное окно с меню, содержащим пункт

File
и еще два фиктивных пункта. В меню
File
есть команда
Exit
, которая завершает приложение. Оба пункта
File
и
Exit
снабжены всплывающими подсказками.

Листинг 12.8. Пример меню в GTK

$KCODE = "U"

require "gtk2"

class MenuWindow < Gtk::Window

 def initialize

super("Ruby/GTK2 Menu Sample")

signal_connect("destroy") { Gtk.main_quit }

file_exit_item = Gtk::MenuItem.new("_Exit")

file_exit_item.signal_connect("activate") { Gtk.main_quit }

file_menu = Gtk::Menu.new

file_menu.add(file_exit_item)

file_menu_item = Gtk::MenuItem.new("_File")

file_menu_item.submenu = file_menu

menubar = Gtk::MenuBar.new

menubar.append(file_menu_item)

menubar.append(Gtk::MenuItem.new("_Nothing"))

menubar.append(Gtk::MenuItem.new("_Useless"))

tooltips = Gtk::Tooltips.new

tooltips.set_tip(file_exit_item, "Exit the app", "")

box = Gtk::VBox.new

box.pack_start(menubar, false, false, 0)

box.add(Gtk::Label.new("Try the menu and tooltips!"))

add(box)

set_default_size(300, 100)

show_all

 end

end

Gtk.init

MenuWindow.new

Gtk.main

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

Gtk::MenuItem
с именем
Exit
и задаем для него обработчик события, который завершает программу. Событие называется
activate
и генерируется, когда пользователь выбирает пункт меню.

Далее создается меню

File
и в него добавляется пункт
Exit
. Это все, что требуется для создания выпадающего меню. В конце создается пункт меню
File
; именно он и появится в полосе меню. Чтобы присоединить пункт
File
к меню
File
, мы вызываем метод
submenu=
.

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

Рыцарь из ниоткуда. Сборник

Бушков Александр Александрович
Сварог
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Рыцарь из ниоткуда. Сборник

Романовы. Семейные тайны русских императоров

Балязин Вольдемар Николаевич
Научно-образовательная:
история
5.00
рейтинг книги
Романовы. Семейные тайны русских императоров

Вершитель

Осадчук Алексей Витальевич
7. Андердог
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Вершитель

Удар. Мир Теллы

Борн Иван
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Удар. Мир Теллы

Красный священник

Юань Е
4. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Красный священник

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

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

"Фантастика 2023-94". Компиляция. Книги 1-16

Перумов Ник
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-94. Компиляция. Книги 1-16

Иржина

Завойчинская Милена
Фантастика:
фэнтези
8.12
рейтинг книги
Иржина

Цвет сверхдержавы - красный 3 Восхождение. часть 1

Сергей Симонов
3. Цвет сверхдержавы - красный
Фантастика:
альтернативная история
5.00
рейтинг книги
Цвет сверхдержавы - красный 3 Восхождение. часть 1

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Кухня народов СССР

Фельдман Исай Абрамович
Дом и Семья:
кулинария
7.00
рейтинг книги
Кухня народов СССР

Шайтан Иван 5

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

Большая Советская Энциклопедия (МЕ)

Большая Советская Энциклопедия
Справочная литература:
энциклопедии
5.00
рейтинг книги
Большая Советская Энциклопедия (МЕ)

Древние тайны (Сборник)

Булычев Кир
Алиса и ее друзья в лабиринтах истории
Детские:
детская фантастика
6.00
рейтинг книги
Древние тайны (Сборник)