PyGtk3~允许来自用户的信号,但不是以编程方式

时间:2013-01-01 22:04:55

标签: python signals infinite-loop pygobject

我的问题与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。 哪个好。

当代码执行标记为#1 的行时,会调用

on_changed_path()。 这会导致永无止境的循环。

我的问题是:如何阻止#1行触发更改的信号。?

注意:我也会在代码的其他部分调用self.cbtPaths.set_active(i)

3 个答案:

答案 0 :(得分: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's documentation,虽然有点限制。

答案 1 :(得分:0)

在set_active之前,从cbtPaths更改事件断开on_changed_pa​​th。 set_active重新连接后。

答案 2 :(得分: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修改,所以没有更多的信号。