2013-01-01 28 views
1

我的問題與PyGObject,Gtk3和信號抑制有關。PyGtk3〜允許來自用戶的信號,但不是以編程方式

我有一個ComboBoxText,連接了一個信號。

self.cbtPaths = Gtk.ComboBoxText() 
self.cbtPaths.connect("changed", self.on_changed_path) 

def on_changed_path(self,action): 
    path = self.cbtPaths.get_active_text() 
    i = self.hPaths.change(path) 
    self.cbtPaths.set_active(i) #1 

self.on_changed_path()當用戶改變ComboBoxText被調用。 哪個好。

on_changed_path()在代碼執行標記爲#1的行時被調用。 這會導致永無止境的循環。

我的問題是:如何防止在#1的行觸發更改信號。

注意:我還在另一部分代碼中調用self.cbtPaths.set_active(i)

+0

我不認爲你想在你的on_changed_pa​​th方法中調用set_active。當選擇已經改變時,on_changed_pa​​th將被調用,所以不需要再次設置它。我不明白hPaths和cbtPaths的關係。 – ditkin

+0

感謝您的評論ditkin, hPaths是我寫的幫助器類,它用新項目填充ComboBoxText。這些新項目基於用戶從ComboBoxText中選擇的值。 –

回答

2

您可能需要handler_block()handler_unblock()。前者阻止實例的處理程序在任何信號發射期間不被調用。該處理程序將被阻止,直到您解除阻止。

你可以嘗試這樣的:

self.cbtPaths.handler_block(self.on_changed_path) 
self.cbtPaths.set_active(i) 
self.cbtPaths.handler_unblock(self.on_changed_path) 

您還可以檢查GOBject API's documentation,雖然是有點有限。

0

在set_active之前,從cbtPaths更改事件中斷開on_changed_pa​​th。 set_active重新連接後。

0

答案並不是擺弄信號,而是讓處理程序檢查它是否應該允許自己再次觸發。

def on_cbtPaths_changed(self,action): 
    if not self.hPath.is_organised(): #1 
     self.hPath.organise() 
    else: 
     self.btnUpdate.emit("clicked") #2 
    return True 

因此,當用戶或程序,改變ComboBoxText插件:

  • 另一類修改ComboBoxText的內容(#1)。
  • 修改再次觸發處理程序。
  • 這次內容不需要修改(#2)。
  • #2沒有任何修改,所以沒有更多的信號。
相關問題