3

I have a Glade file with some buttons and I use Gtk.Builder.connect_signals() to connect methods (on_button_toggled) with the corresponding signals (toggled). (It is acutally quickly which does that for me, but I can see and change that code, so that is only a detail).

What I want to do now, is stop a signal from being processed, e.g. though a call to object.handler_block(handler_id) or object.disconnect(handler_id). So my question is: how can I get the handler_ids for connections created via Gtk.Builder.connect_signals()?

Normally you would get the handler_id from a call to one of:

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)

but the Gtk.Builder version does not return the ids.

4

3 に答える 3

4

残念ながら、 によって接続されたシグナル ハンドラ ID を取得する方法はないと思いますGtk.Builder。ハンドラーが本当に必要な場合は、シグナルを手動で接続して、関心のあるすべてhandler_idの を保存する必要があります。

別のアプローチは、ハンドラー自体は実際には必要ないが、ブロック/ブロック解除/などを行うことができると判断することです。接続された callable に基づいて、usingGObject.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 に答える