В следующих четырех строчках в поле ввода добавляется текст. В первой строчке мы получаем объект 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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату