2010-11-18 70 views
2

我這個連接所有信號gtk.buildergtk.builder如何斷開信號?

ui_builder = gtk.Builder() 
ui_builder.add_from_file('main.ui') 
self.win_main = builder.get_object('win_main') 
ui_builder.connect_signals(self) 

我怎麼能阻止/斷開任何/所有的信號嗎? (並重新連接?)

在此先感謝!

+0

我正要問一個同樣的問題:鑑於我想用'glade'來描述我的接口並聲明信號名稱,我該如何以編程方式斷開我可以以編程方式連接的東西? – mariotomo 2015-08-20 13:48:17

回答

2

gtk.builder提供connect_signals()作爲一種方便,一旦信號被連接,它就由您來編程地阻止或斷開信號。

這裏是既阻塞信號和斷開處理程序的PyGTK文檔:

http://www.pygtk.org/pygtktutorial/ch-advancedeventsandsignals.html

+0

但這個答案只是告訴我們「如果你有handler_id,那麼你可以斷開信號」。 gtk.builder.connect_signals不提供它所做的handler_id。 – mariotomo 2015-08-20 13:29:11

0

我在這樣的情況下做的,是與gtk.Builder.connect_signals手動連接的信號,而不是因爲這個方法沒有返回他們的 處理程序標識符,並沒有該處理程序,你不能操縱信號。

在我的情況只是一些信號,沒什麼大不了的。

0

我現在正在做的事:忘記gtk.builder.connect_signals

代碼經過這麼:

ui_builder = gtk.Builder() 
ui_builder.add_from_file('main.ui') 
self.win_main = builder.get_object('win_main') 

我會與此類似:

list_of_handler_ids = [] 
import libxml2 
doc = libxml2.parseFile('main.ui') 
ctxt = doc.xpathNewContext() 
signals = ctxt.xpathEval('//signal') 
for s in signals: 
    handler = getattr(self, s.prop('handler')) 
    signaller = getattr(self.win_main, s.parent.prop('id')) 
    handler_id = signaller.connect(s.prop('name'), handler) 
    list_of_handler_ids.append(handler_id) 

這似乎是第一個快速檢查後進行排序工作。

+0

或更好的使用lxml,代碼看起來基本相同,但lxml可以從pypi安裝 – mariotomo 2015-08-20 20:10:20