我的问题与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行触发更改的信号。?
注意:我也会在代码的其他部分调用self.cbtPaths.set_active(i)
。
答案 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_path。 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小部件时: