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