Виджеты 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, “Пример линеек” показывает получаемое окно:
Исходный код 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) |