Линейки (gtk.HRuler, gtk.VRuler)

Виджеты Ruler используются для отображения положения указателя мыши в окне так, как это сделано в GIMP. Окно может иметь горизонтальную линейку, размещённую от края до края и вертикальную линейку, размещённую сверху вниз. Маленький треугольный индикатор на линейке показывает положение указателя относительно линейки.

Горизонтальные и вертикальные линейки создаются с помощью функций:

  hruler = gtk.HRuler()    # горизонтальная линейка

  vruler = gtk.VRuler()    # вертикальная линейка

Когда линейка создана, мы можем определить единицу измерения. Единицами могут быть PIXELS, INCHES или CENTIMETERS. Они устанавливаются с помощью метода:

  ruler.set_metric(metric)

По умолчанию используется PIXELS.

  ruler.set_metric(gtk.PIXELS)

Другой важной характеристикой линейки является то, как отмечать единицы шкалы, и положение индикатора по умолчанию. Для установки используется метод:

  ruler.set_range(lower, upper, position, max_size)

Аргументы lower и upper определяют размер линейки, и max_size  – самое большое отображаемое число. Position определяет позицию индикатора по умолчанию.

Вертикальная линейка может охватить окно в 800 пикселей следующим образом:

  vruler.set_range(0, 800, 0, 800)

Отметки отображаются на линейке от 0 до 800, с числом для каждого сотого пикселя. Если нам нужна линейка для диапазона от 7 до 16:

  vruler.set_range(7, 16, 0, 20)

Индикатор на линейке это маленькая треугольная метка. Если линейка используется для следования за курором мыши, сигнал “motion_notify_event” должен быть подключен к методу “motion_notify_event” линейки. Нам нужно настроить callback-функцию для “motion_notify_event” и использовать connect_object() для того, чтобы позволить линейке излучать “motion_notify_signal”:

def motion_notify(ruler, event):
    return ruler.emit("motion_notify_event", event)

area.connect_object("motion_notify_event", motion_notify, ruler)

Пример rulers.py создаёт область для рисования с горизонтальной линейкой сверху и вертикальной линейкой слева. Размер области: 600 пикселей в ширину и 400 в высоту. Горизонтальная линейка измеряет от 7 до 13, с отметкой каждые 100 пикселей, когда вертикальная измеряет от 0 до 400 с отметкой каждые 100 пикселей. Расположение области рисования и линеек выполнено с помощью таблицы. Рисунок 9.8, “Пример линеек” показывает получаемое окно:

Рисунок 9.8. Пример линеек

Rulers Example

Исходный код rulers.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example rulers.py

import pygtk
pygtk.require('2.0')
import gtk

class RulersExample:
    XSIZE = 400
    YSIZE = 400

    # Этот шаблон получает управление при клике на кнопку закрытия
    def close_application(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.close_application)
        window.set_border_width(10)

        # Создаём таблицу для размещения линеек и области рисования
        table = gtk.Table(3, 2, False)
        window.add(table)

        area = gtk.DrawingArea()
        area.set_size_request(self.XSIZE, self.YSIZE)
        table.attach(area, 1, 2, 1, 2,
                     gtk.EXPAND|gtk.FILL, gtk.FILL, 0, 0 )
        area.set_events(gtk.gdk.POINTER_MOTION_MASK |
                        gtk.gdk.POINTER_MOTION_HINT_MASK )

        # Горизонтальная линейка наверху. Когда курсор проходит по
        # области рисования, motion_notify_event передаётся
        # в подходящий обработчик для линейки.
        hrule = gtk.HRuler()
        hrule.set_metric(gtk.PIXELS)
        hrule.set_range(7, 13, 0, 20)
        def motion_notify(ruler, event):
            return ruler.emit("motion_notify_event", event)
        area.connect_object("motion_notify_event", motion_notify, hrule)
        table.attach(hrule, 1, 2, 0, 1,
                     gtk.EXPAND|gtk.SHRINK|gtk.FILL, gtk.FILL, 0, 0 )
    
        # Вертикальная линейка слева. При движении мыши
        # по области рисования motion_notify_event передаётся
        # в подходящий обработчик для линейки
        vrule = gtk.VRuler()
        vrule.set_metric(gtk.PIXELS)
        vrule.set_range(0, self.YSIZE, 10, self.YSIZE)
        area.connect_object("motion_notify_event", motion_notify, vrule)
        table.attach(vrule, 0, 1, 1, 2,
                     gtk.FILL, gtk.EXPAND|gtk.SHRINK|gtk.FILL, 0, 0 )

        # Теперь показываем всё
        area.show()
        hrule.show()
        vrule.show()
        table.show()
        window.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    RulersExample()
    main()

Строки 42 и 52 подключают callback-функцию motion_notify() к области, и передают hrule в строке 42 и vrule в строке 52 как пользовательские данные. Функция motion_notify() будет вызываться дважды при движении мыши, один раз с hrule и c vrule.


Предыдущая страница На уровень выше  Следующая страница
9.6. Изображения К оглавлению  9.8. Строка состояния (gtk.StatusBar)

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

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

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