Пример работы виджетов регулировки диапазона

Программа rangewidgets.py создаёт окно с тремя виджетами регулировки диапазона, подключёнными к одному регулятору, и несколько виджетов управляющих параметрами регулятора, которые мы рассматривали выше в разделе “Регуляторы”, теперь вы сможете посмотреть как они работают со стороны пользователя. Рисунок 8.1, “Пример виджетов регулировки диапазона” показывает результат запуска программы:

Рисунок 8.1. Пример виджетов регулировки диапазона

Range Widgets Example

Исходный код 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. Разнообразные виджеты

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>