我有三个相互依赖的PyGTK SpinButton:称它们为A、B和C。还有一个按钮D可以在C的两个倒数定义之间切换,这样C的值就被定义为A/B,除非D被按了奇数次。
例如,我希望能够更改A,并根据此关系立即更新B或C。我还希望能够更改B并立即更新A或C。C也是如此。我决定,当一个被更改时,最近更改最少的SpinButton应该被更新,如果自程序开始以来没有更改任何SpinButton,那么应该假设C是最近更改的。
以上内容均已落实。我的应用程序侦听每个SpinButtons的值更改信号,执行上面的计算,然后更新其他两个的值,如前所述。但是,应用程序会获取自己的更改并对其做出响应。当我更改A时,我的程序会更改B,这是通过更改C来处理的,等等。我也尝试过更改值信号,但它对SpinButton的更改没有响应。
如何以程序本身不会触发的方式侦听SpinButton值的更改?
在调用给定微调器的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()