2010-11-18 35 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