如何从Gtk.Builder.connect_signals访问处理程序ID

时间:2012-08-03 09:45:28

标签: python gtk glade

我有一个带有一些按钮的Glade文件,我使用Gtk.Builder.connect_signals()将方法(on_button_toggled)与相应的信号(toggled)连接起来。 (实际上quickly对我来说是这样的,但我可以看到并更改该代码,因此这只是一个细节。)

我现在要做的是停止处理信号,例如虽然拨打了object.handler_block(handler_id)object.disconnect(handler_id)。所以我的问题是:我怎样才能获得handler_id通过Gtk.Builder.connect_signals()创建的连接?

通常情况下,您可以通过以下方式之一获得handler_id

handler_id = object.connect(name, cb, cb_args)  
handler_id = object.connect_after(name, cb, cb_args)
handler_id = object.connect_object(name, cb, slot_object, cb_args)  
handler_id = object.connect_object_after(name, cb, slot_object, cb_args)

但Gtk.Builder版本不返回ID。

3 个答案:

答案 0 :(得分:3)

可悲的是,我不相信有任何方法可以获得由Gtk.Builder连接的信号处理程序ID。如果您真的需要处理程序,则必须手动连接信号,存储您关心的任何handler_id

另一种方法是确定您实际上并不需要处理程序,但可以阻止/取消阻止/等。基于连接的可调用,使用GObject.handler_block_by_func和类似的。

最后一个选项是尝试在事后找到处理程序,尽可能多地使用详细信息。在C中,使用g_signal_handler_find;这不是pygtk2的约束,但可能会使用pygobject3。这方面的缺点是,无法保证您能找到实际连接的内容。

答案 1 :(得分:2)

这对您来说可能为时已晚,但我有一个解决方案可以获取您点击的小部件的名称...

self.builder.connect_signals(self)

this source开始,作者使用gtk.Buildable.get_name()来获取窗口小部件/对象的名称。在我的方案中,根据单击的按钮,发生了不同的操作。我想将相同的事件处理程序附加到某个类型的所有按钮,因为它们在很大程度上做同样的事情。这是代码。

import gtk

class GUI:
  def __init__(self):
    self.builder = gtk.Builder()
    self.builder.add_from_file('myGUI.glade')
    self.builder.connect_signals(self)
    self.window = self.builder.get_object("window1")
    self.window.show()

  def on_button_click(self, object, data=None):
    print(gtk.Buildable.get_name(object))

非常酷,嗯?我想是这样,至少。

答案 2 :(得分:0)

使用PyGObject,最好的方法是我认为的signal_handler_find方法。使用此函数,该函数使用GObject中的两个函数

def get_handler_id(obj, signal_name):
    signal_id, detail = GObject.signal_parse_name(signal_name, obj, True)
    return GObject.signal_handler_find(obj, GObject.SignalMatchType.ID, signal_id, detail, None, None, None)

用法示例:

get_handler_id(button, "clicked")

将使您获得handler_id的处理程序,该处理程序连接到clicked的{​​{1}}信号。然后可以将其用于button