Категории
Самые читаемые
Лучшие книги » Компьютеры и Интернет » Программирование » Программирование на языке Ruby - Хэл Фултон

Программирование на языке Ruby - Хэл Фултон

Читать онлайн Программирование на языке Ruby - Хэл Фултон

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 95 96 97 98 99 100 101 102 103 ... 156
Перейти на страницу:

  @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 позволяет задавать и другие свойства тегов.

В данном случае мы хотим воспользоваться шрифтом из семейства 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

 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 первоначально пуста, но позже в нее будет записана строка, определяющая вид заказанного билета.

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

1 ... 95 96 97 98 99 100 101 102 103 ... 156
Перейти на страницу:
На этой странице вы можете бесплатно скачать Программирование на языке Ruby - Хэл Фултон торрент бесплатно.
Комментарии