Программа rangewidgets.py создаёт окно с тремя виджетами регулировки диапазона, подключёнными к одному регулятору, и несколько виджетов управляющих параметрами регулятора, которые мы рассматривали выше в разделе “Регуляторы”, теперь вы сможете посмотреть как они работают со стороны пользователя. Рисунок 8.1, “Пример виджетов регулировки диапазона” показывает результат запуска программы:
Исходный код rangewidgets.py:
#!/usr/bin/env python # --*-- coding:utf-8 --*-- # example rangewidgets.py import pygtk pygtk.require('2.0') import gtk # Удобные функции def make_menu_item(name, callback, data=None): item = gtk.MenuItem(name) item.connect("activate", callback, data) item.show() return item def scale_set_default_values(scale): scale.set_update_policy(gtk.UPDATE_CONTINUOUS) scale.set_digits(1) scale.set_value_pos(gtk.POS_TOP) scale.set_draw_value(True) class RangeWidgets: def cb_pos_menu_select(self, item, pos): # Устанавливает положение значения в двух виджетах Scale self.hscale.set_value_pos(pos) self.vscale.set_value_pos(pos) def cb_update_menu_select(self, item, policy): # Устанавливает политику обновлений для двух виджетов Scale self.hscale.set_update_policy(policy) self.vscale.set_update_policy(policy) def cb_digits_scale(self, adj): # Устанавливает количество десятичных цифр, до которых округляется adj->value. self.hscale.set_digits(int(adj.value)) self.vscale.set_digits(int(adj.value)) def cb_page_size(self, get, set): # Устанавливает page_size и page_incr # регулятора в значение указанное в "Page Size" виджета Scale set.page_size = get.value set.page_incr = get.value # Теперь излучаем сигнал для перенастройки всех виджетов # которые соединены с этим регулятором set.emit("changed") def cb_draw_value(self, button): # Устанавливает показывать value виджета Scale или нет # в зависимости от состояния переключателя self.hscale.set_draw_value(button.get_active()) self.vscale.set_draw_value(button.get_active()) # Создаём окно def __init__(self): # Стандартное создание окна self.window = gtk.Window (gtk.WINDOW_TOPLEVEL) self.window.connect("destroy", lambda w: gtk.main_quit()) self.window.set_title("Управление диапазоном") box1 = gtk.VBox(False, 0) self.window.add(box1) box1.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) box1.pack_start(box2, True, True, 0) box2.show() # value, lower, upper, step_increment, page_increment, page_size # Заметьте, что влияет только для виджетов Scrollbar # И максимальное значение вы можете получить по формуле # (upper - page_size). adj1 = gtk.Adjustment(0.0, 0.0, 101.0, 0.1, 1.0, 1.0) self.vscale = gtk.VScale(adj1) scale_set_default_values(self.vscale) box2.pack_start(self.vscale, True, True, 0) self.vscale.show() box3 = gtk.VBox(False, 10) box2.pack_start(box3, True, True, 0) box3.show() # Повторно используем этот же регулятор self.hscale = gtk.HScale(adj1) self.hscale.set_size_request(200, 30) scale_set_default_values(self.hscale) box3.pack_start(self.hscale, True, True, 0) self.hscale.show() # Используем этот регулятор ещё раз scrollbar = gtk.HScrollbar(adj1) # Заметьте как виджеты Scale всегда обновляются # постоянно когда передвигается Scrollbar scrollbar.set_update_policy(gtk.UPDATE_CONTINUOUS) box3.pack_start(scrollbar, True, True, 0) scrollbar.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) box1.pack_start(box2, True, True, 0) box2.show() # CheckButton управляющие показом значения регулятора button = gtk.CheckButton("Отображать значения шкалы") button.set_active(True) button.connect("toggled", self.cb_draw_value) box2.pack_start(button, True, True, 0) button.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) # Меню выбора положения на окне значения регулятора label = gtk.Label("Позиция значений шкалы:") box2.pack_start(label, False, False, 0) label.show() opt = gtk.OptionMenu() menu = gtk.Menu() item = make_menu_item ("Вверху", self.cb_pos_menu_select, gtk.POS_TOP) menu.append(item) item = make_menu_item ("Внизу", self.cb_pos_menu_select, gtk.POS_BOTTOM) menu.append(item) item = make_menu_item ("Слева", self.cb_pos_menu_select, gtk.POS_LEFT) menu.append(item) item = make_menu_item ("Справа", self.cb_pos_menu_select, gtk.POS_RIGHT) menu.append(item) opt.set_menu(menu) box2.pack_start(opt, True, True, 0) opt.show() box1.pack_start(box2, True, True, 0) box2.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) # Ещё одно меню выбора, на этот раз для политики обновлений # виджетов Scale label = gtk.Label("Политика обновлений шкалы:") box2.pack_start(label, False, False, 0) label.show() opt = gtk.OptionMenu() menu = gtk.Menu() item = make_menu_item("Continuous", self.cb_update_menu_select, gtk.UPDATE_CONTINUOUS) menu.append(item) item = make_menu_item ("Discontinuous", self.cb_update_menu_select, gtk.UPDATE_DISCONTINUOUS) menu.append(item) item = make_menu_item ("Delayed", self.cb_update_menu_select, gtk.UPDATE_DELAYED) menu.append(item) opt.set_menu(menu) box2.pack_start(opt, True, True, 0) opt.show() box1.pack_start(box2, True, True, 0) box2.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) # Виджет HScale, для установки количества цифр # виджетов Scale. label = gtk.Label("Разрядов в шкале:") box2.pack_start(label, False, False, 0) label.show() adj2 = gtk.Adjustment(1.0, 0.0, 5.0, 1.0, 1.0, 0.0) adj2.connect("value_changed", self.cb_digits_scale) scale = gtk.HScale(adj2) scale.set_digits(0) box2.pack_start(scale, True, True, 0) scale.show() box1.pack_start(box2, True, True, 0) box2.show() box2 = gtk.HBox(False, 10) box2.set_border_width(10) # И последний виджет HScale для управления значением page_size # для виджета ScrollBar. label = gtk.Label("Размер страницы Scrollbar:") box2.pack_start(label, False, False, 0) label.show() adj2 = gtk.Adjustment(1.0, 1.0, 101.0, 1.0, 1.0, 0.0) adj2.connect("value_changed", self.cb_page_size, adj1) scale = gtk.HScale(adj2) scale.set_digits(0) box2.pack_start(scale, True, True, 0) scale.show() box1.pack_start(box2, True, True, 0) box2.show() separator = gtk.HSeparator() box1.pack_start(separator, False, True, 0) separator.show() box2 = gtk.VBox(False, 10) box2.set_border_width(10) box1.pack_start(box2, False, True, 0) box2.show() button = gtk.Button("Выход") button.connect("clicked", lambda w: gtk.main_quit()) box2.pack_start(button, True, True, 0) button.set_flags(gtk.CAN_DEFAULT) button.grab_default() button.show() self.window.show() def main(): gtk.main() return 0 if __name__ == "__main__": RangeWidgets() main()
Вы должны заметить, что порграмма не вызывает метод connect() для “delete_event”, а только для сигнала “destroy”. Это выполнит желаемую операцию, так как необработанный “delete_event” выдаёт окну сигнал “destroy”.
Предыдущая страница | На уровень выше | Следующая страница |
8.4. Привязки к клавиатуре и мыши | К оглавлению | Глава 9. Разнообразные виджеты |