Python 为什么两个链接的gtk切换按钮会出现运行时错误?
我有两个切换按钮,我想链接在一起,以便按下一个释放另一个。我的信号是这样的Python 为什么两个链接的gtk切换按钮会出现运行时错误?,python,gtk,pygtk,signals,togglebutton,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
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中出错:
运行时错误
最初的例外是:
运行时错误
按钮工作正常,没有崩溃,但我不知道为什么会出现错误,或者这意味着什么。如果我不链接按钮,我不会得到任何错误
有人知道如何修复此问题吗?当我运行您的代码时,会出现以下异常:
运行时错误:超过最大递归深度,按钮不工作
我的解释是:
当您单击按钮1时,它会发出切换的信号,并在\u btn1\u tgl\u clicked()
方法上执行
在这种方法中,您使用gtk.ToggleButton.set_active()
,它也会发出一个toggled
信号,在\u btn2\u tg1\u clicked()
方法上调用您的,该方法也会发出一个toggled
信号
所以,我们进入无限循环。这就是提出例外的原因
在设置按钮的状态之前,只需检查它是否已经具有您要设置的状态。为什么每次用户更改按钮时都要更改按钮的状态?如果要阻止用户更改,请使用widget.set\u sensitive(False)
。或者,如果您想防止基于某些条件更改状态,我认为您可以在中返回True
,然后单击“
”,说GTK“我已经处理了此事件,所以您自己不处理它”,GTK不会更改其状态。如果返回False
或什么都不返回,GTK将处理它并更改其状态。我最终解决了这个问题,将第二个按钮设置为第一个按钮的相反位置,而不是当前状态的相反位置。大概是
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)
这似乎没有受到其他解决方案的递归问题的影响。当我运行代码时,我得到了一个异常:RuntimeError:超过了最大递归深度(并且按钮不起作用)。我的解释是:当你点击按钮1时,它会发出“toggled”信号,并在点击()的方法上执行你的。在这个方法中,您使用gtk.ToggleButton.set_active()
,它发出一个切换信号,在\u btn2\u tg1\u clicked()
方法上调用您的,该方法也发出一个切换信号。所以,我们进入无限循环。这就是为什么会出现例外情况。@LoïcGRENON我很害怕。我最初让它使用“切换”信号,但我认为这会产生这种递归效果,所以我将其更改为“单击”信号。从中,听起来似乎只有用户操作才会发出该信号。但我想不是。你对如何设置成对按钮有什么想法吗?我想一定有办法。@LoïcGRENON好的。嗯,你回答了我的问题,所以如果你想把你的评论作为答案,我会把它标记为正确的。也许我会开始另一个问题,关于如何实际链接这两个按钮。我想一定也有办法,但我不知道怎么做。可以使用gtk.RadioButton
,因为它有set_group
方法,但gtk.ToggleButton
没有。方法是在调用toggle.set_active之前阻塞信号处理程序,然后释放它。GLib中有这样的功能。每次用户更改第一个按钮时,我都要更改另一个按钮的状态。