如何在gtk.builder中断开信号?

3 投票
3 回答
1479 浏览
提问于 2025-04-16 07:18

我用这个方法把所有信号都连接到 gtk.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)

请问我怎么才能阻止/断开任何或所有信号呢?(还有怎么重新连接?)

提前谢谢你们!

3 个回答

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

在这种情况下,我会手动连接信号,而不是使用 gtk.Builder.connect_signals,因为这个方法不会返回信号处理器的ID,没有这个ID你就无法操作信号。

对我来说,只是几个信号,没什么大不了的。

2

gtk.builder 提供了一个叫 connect_signals() 的方便功能,一旦信号连接好了,接下来就得靠你自己来编程去阻止或者断开这些信号。

这里有关于如何阻止信号和断开处理程序的 PyGTK 文档:

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

撰写回答