Регулятор изнутри

Да, вы скажете: “Это хорошо, но если я хочу создать свой собственный обработчик и отвечать на изменения в виджете регулировки диапазона, либо SpinButton, то как мне получить значение в этих обработчиках?”. Для того, чтобы ответить на этот и другие вопросы, давайте посмотрим на свойства объекта gtk.Adjustment:

  lower
  upper
  value
  step_increment
  page_increment
  page_size

Если adj – это экземпляр gtk.Adjustment, то для доступа к каждому из полей нужно использовать adj.lower, adj.value, и.т.д.

Теперь, когда вы установили значение регулятора, то вы захотите чтобы это изменение отразилось на всех виджетах его использующих. PyGTK предоставляет для этого метод:

adjustment.set_value(value)

Как говорилось выше, Adjustment это подкласс Object, также, как и виджеты, способен излучать сигналы. Это, конечно, ответ на то, почему изменения происходят автоматически, когда вы разделяете регулятор между несколькими виджетами. Все регулируемые виджеты присоединяют обработчики сигналов к сигналам value_changed. Здесь показано определение этого callback:

def value_changed(adjustment):

Разные виджеты использующие регуляторы будут излучать этот сигнал при изменении значения. Это происходит и тогда, когда пользователь сам изменяет виджет регулировки диапазона, так и тогда, когда вы сами изменяете значение внутри программы с помощью метода set_value(). Так, например, вы имеете виджет Scale, и хотите изменить поворот картинки, когда значение меняется. Вы можете создать callback похожий на этот:

def cb_rotate_picture(adj, picture):
    set_picture_rotation (picture, adj.value)
...

И присоединить его к регулятору виджета Scale так:

adj.connect("value_changed", cb_rotate_picture, picture)

Что, если, после того, как виджет переназначит поля upper или lower своего регулятора, а пользователь добавит больше текста в виджет Text? В этом случае, он излучит сигнал changed, который выглядит так:

def changed(adjustment):

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

Вероятно вы не будете подключать обработчик к этому сигналу, разве что вы будете писать новый виджет регулировки диапазона. Конечно, если вы напрямую поменяете какие-либо поля Adjustment, вы должны излучить сигнал, для того чтобы перенастроить виджеты, использующие этот регулятор:

adjustment.emit("changed")

Предыдущая страница На уровень выше  Следующая страница
7.2. Лёгкий способ использования регуляторов К оглавлению Глава 8. Виджеты регулировки диапазона

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

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

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