我有一个带有一些按钮的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。
答案 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
。