2011-05-23 99 views
1

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

我希望能够例如更改A并根据此关系立即更新B C.我也希望能够更改B并立即更新A C.对于C也是如此。我已经决定当一个变化时,最近变化最小的SpinButton应该被更新,并且如果自程序开始以来没有改变SpinButtons,应该假设C最近被改变了。

上面的一切都已经实现。我的应用程序侦听每个SpinButton的值更改信号,执行上面的计算,然后更新其他两个值(如上所述)。但是,应用程序会自行更改并响应它们。当我改变A时,我的程序改变了B,这是通过改变C来处理的,等等。我也尝试过更改值信号,但它不响应SpinButton的更改。

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

回答

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

谢谢;工作! – 2011-05-24 02:51:35