为什么我用两个链接的gtk切换按钮得到运行时错误?

时间:2011-10-29 20:02:06

标签: python gtk pygtk signals togglebutton

我有两个切换按钮,我想连接在一起,以便按下一个按钮释放另一个。所以我的信号看起来像这样

def on_btn1_tgl_clicked(self, widget, data=None):
    toggled = not self.btn2_toggle.get_active()
    self.btn2_toggle.set_active(toggled)

def on_btn2_tgl_clicked(self, widget, data=None):
    toggled = not self.btn1_toggle.get_active()
    self.btn1_toggle.set_active(toggled)

这似乎与我期望的一样,除了当我运行代码时我得到了这个错误

  

sys.excepthook中的错误:

     

RuntimeError

     

最初的例外是:

     

RuntimeError

按钮工作正常,没有任何崩溃,但我不知道为什么我得到错误,或它意味着什么。如果我没有链接按钮,我不会收到任何错误。

有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

当我运行你的代码时,我得到了这个例外:

RuntimeError: maximum recursion depth exceeded并且按钮不起作用。

我的解释是:

  1. 当您点击按钮1时,它会发出toggled信号并执行您的on_btn1_tgl_clicked()方法。
  2. 在此方法中,您使用gtk.ToggleButton.set_active()发出toggled信号,调用on_btn2_tg1_clicked()方法并发出toggled信号。

    所以,我们进入无限循环。这就是提出异常的原因。

答案 1 :(得分:1)

在设置按钮的状态之前,只需检查它是否已经具有您要设置的状态。

答案 2 :(得分:0)

为什么每次用户更改按钮时都要更改按钮的状态?如果您想阻止用户更改,请使用widget.set_sensitive(False)。或者如果你想根据某些条件阻止改变状态,我认为你可以在True中返回on_btn1_tgl_clicked来说GTK“我已经处理过这个事件了,所以你自己不要处理它”,GTK将会不改变它的状态。如果您返回False或没有,GTK将处理它并更改其状态。

答案 3 :(得分:0)

我最后通过将第二个按钮设置为与第一个按钮相反的方式来解决此问题,而不是与当前状态相反。像

这样的东西
def on_btn1_tgl_clicked(self, widget, data=None):
    toggle_val = self.btn1_toggle.get_active()
    self.btn2_toggle.set_active(not toggle_val)

def on_btn2_tgl_clicked(self, widget, data=None):
    toggle_val = self.btn2_toggle.get_active()
    self.btn1_toggle.set_active(not toggle_val)

这似乎没有受到其他解决方案的递归问题的影响。