2011-05-23 93 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