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 与 cbtPaths 更改事件的连接。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 回答