1

私の質問は、PyGObject、Gtk3、および信号抑制に関連しています。

信号がComboBoxText接続された があります。

self.cbtPaths = Gtk.ComboBoxText()
self.cbtPaths.connect("changed", self.on_changed_path)

def on_changed_path(self,action):
    path = self.cbtPaths.get_active_text()
    i = self.hPaths.change(path)
    self.cbtPaths.set_active(i) #1

self.on_changed_path()ユーザーが を変更すると呼び出されますComboBoxText。どっちがいい。

on_changed_path()コードが#1とマークされた行を実行するときに呼び出されます。これにより、終わりのないループが発生します。

私の質問は: #1 の行が変更されたシグナルをトリガーしないようにするにはどうすればよいですか?

注:self.cbtPaths.set_active(i)コードの別の部分も呼び出します。

4

3 に答える 3

2

handler_block()おそらくとが必要ですhandler_unblock()。前者は、シグナルの発行中にインスタンスのハンドラーが呼び出されないようにブロックします。そのハンドラーは、ブロックを解除するまでブロックされます。

次のようなものを試すことができます:

self.cbtPaths.handler_block(self.on_changed_path)
self.cbtPaths.set_active(i)
self.cbtPaths.handler_unblock(self.on_changed_path)

少し制限がありますが、GOBject API のドキュメントを確認することもできます。

于 2013-01-17T00:50:18.313 に答える
0

set_activeの前に、on_changed_pa​​thをcbtPathschangedイベントから切断します。set_activeの後、再接続します。

于 2013-01-01T22:43:06.067 に答える
0

答えは、シグナルをいじることではなく、ハンドラーが再びトリガーされることを許可するかどうかを確認することでした。

def on_cbtPaths_changed(self,action):
    if not self.hPath.is_organised(): #1
        self.hPath.organise()
    else:
        self.btnUpdate.emit("clicked") #2
    return True  

したがって、ユーザーまたはプログラムが ComboBoxText ウィジェットを変更すると、次のようになります。

  • 別のクラスが ComboBoxText の内容を変更します (#1)。
  • 変更により、ハンドラーが再びトリガーされます。
  • 今回は内容を変更する必要はありません (#2)。
  • #2によって何も変更されていないため、これ以上シグナルはありません。
于 2013-07-14T19:13:37.623 に答える