Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么两个链接的gtk切换按钮会出现运行时错误?_Python_Gtk_Pygtk_Signals_Togglebutton - Fatal编程技术网

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中有这样的功能。每次用户更改第一个按钮时,我都要更改另一个按钮的状态。