相互依赖的PyGtk SpinButtons

时间:2011-05-23 23:14:39

标签: python user-interface gtk pygtk

我有三个彼此相互依赖的PyGTK SpinButton:称它们为A,B和C.还有另一个按钮D在C的两个倒数定义之间切换,这样C的值定义为A / B除非D被按下了奇数次。

我希望能够根据这种关系立即更改A并立即进行B C更新。我还希望能够立即更改B并进行A C更新。同样适用于C.我已经决定,当一个更改时,应该更新最近最少更改的SpinButton,并且如果自程序开始以来没有更改SpinButton,则应该假设C最近更改了。

以上所有内容都已实施。我的应用程序侦听每个SpinButton的值更改信号,执行上面的计算,然后如上所述更新其他两个的值。但是,应用程序会选择自己的更改并对其进行响应。当我改变A时,我的程序改变B,这是通过改变C来处理的,依此类推。我也尝试了变化值信号,但它没有响应SpinButton的变化。

如何以一种不会被程序本身触发的方式监听SpinButton值的变化?

1 个答案:

答案 0 :(得分: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()