3

我有一个带有一些按钮的 Glade 文件,我用它Gtk.Builder.connect_signals()来连接方法 ( on_button_toggled) 和相应的信号 ( toggled)。(这对我来说很快,但我可以看到并更改该代码,所以这只是一个细节)。

我现在想要做的是停止处理信号,例如通过调用object.handler_block(handler_id)or object.disconnect(handler_id)。所以我的问题是:我怎样才能获得handler_id通过创建的连接的 s 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。

4

3 回答 3

4

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

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

最后的选择是尝试在事后实际找到处理程序,使用尽可能多的细节。在 C 中,使用g_signal_handler_find; 这不适用于 pygtk2,但可能会使用 pygobject3 工作。这里的缺点是不能保证你会找到你实际连接的东西。

于 2012-08-03T21:50:43.007 回答
2

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

self.builder.connect_signals(self)

这个来源,作者使用 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))

很酷,嗯?我认为是的,至少。

于 2014-01-29T16:53:23.590 回答
1

使用 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信号的处理程序button。这可以用于handler_block.

于 2019-08-17T19:22:38.403 回答