Взаимозависимые PyGtk SpinButtons

1

У меня есть три PyGTK SpinButtons, которые взаимно зависимы друг от друга: назовите их A, B и C. Существует еще одна кнопка D, которая переключает между двумя взаимными определениями C, так что значение C определяется как A/B, если D не было нажато нечетное число раз.

Я хочу иметь возможность, например, изменить A и сразу обновить B или C в соответствии с этим соотношением. Я также хочу иметь возможность изменять B и немедленно обновлять A или C. То же самое касается C. Я решил, что когда кто-то изменился, SpinButton, который был изменен в последнее время, должен быть обновлен, и что если с момента запуска программы никаких изменений в SpinButtons не было, следует предположить, что C был изменен совсем недавно.

Все вышеизложенное реализовано. Мое приложение прослушивает сигналы с измененным значением для каждого из SpinButtons, выполняет вычисления выше, а затем обновляет значение двух других, как описано. Однако приложение принимает свои изменения и реагирует на них. Когда я меняю A, моя программа меняет B, которая обрабатывается путем смены C и т.д. Я тоже пробовал сигнал изменения значения, но он не реагирует на изменения в SpinButton.

Как я могу прослушивать изменение значения SpinButton таким образом, который не будет запускаться самой программой?

Теги:
user-interface
gtk
pygtk

1 ответ

1
Лучший ответ

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

import pygtk, gtk
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.connect('destroy', lambda w: gtk.main_quit())

def _add_spinner():
    adj = gtk.Adjustment(0.0, -100.0, 100.0, 1.0, 2.0, 0.0)
    spin = gtk.SpinButton(adj, 0, 1)
    spin.set_wrap(True)
    hbox.pack_start(spin, True, True, 10)
    return spin

vbox = gtk.VBox(True, 10)
hbox = gtk.HBox(True, 10)
vbox.pack_start(hbox, True, True, 10)
spin1 = _add_spinner()
spin2 = _add_spinner()
win.add(vbox)

def set_spin(src, dst):
    # ensure that calling `set_value` does not fire events
    hid = handlers.get(dst)
    dst.handler_block(hid)
    dst.set_value(src.get_value() + 1.5)
    dst.handler_unblock(hid)

# when 'spinN' is changed, call 'set_spin'
hid1 = spin1.connect('value-changed', set_spin, spin2)
hid2 = spin2.connect('value-changed', set_spin, spin1)
handlers = {spin1: hid1, spin2: hid2}
win.show_all()
gtk.main()
  • 0
    Спасибо; это сработало!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню