为什么两个链接的gtk切换按钮会出现运行时错误?

2 投票
4 回答
560 浏览
提问于 2025-04-17 05:15

我有两个切换按钮,我想把它们连在一起,这样按下一个按钮时,另一个按钮就会被释放。所以我的信号设置是这样的:

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 中出错:

运行时错误

原始异常是:

运行时错误

按钮的功能正常,也没有崩溃,但我不知道为什么会出现这个错误,或者这个错误是什么意思。如果我不把按钮连在一起,就不会出现任何错误。

有没有人知道怎么解决这个问题?

4 个回答

0

你为什么想在用户每次改变按钮状态时也去改变它呢?如果你想阻止用户进行更改,可以使用 widget.set_sensitive(False) 这个命令。或者,如果你想根据某些条件来阻止状态改变,我觉得你可以在 on_btn1_tgl_clicked 这个函数里返回 True,这样就告诉GTK:“我已经处理过这个事件了,所以你就别自己处理了。”这样GTK就不会改变按钮的状态。如果你返回 False 或者什么都不返回,GTK就会自己处理这个事件,并且会改变按钮的状态。

1

在你设置按钮的状态之前,先检查一下它现在的状态是不是已经是你要设置的那个状态。

2

当我运行你的代码时,出现了这个错误:

RuntimeError: maximum recursion depth exceeded,而且按钮也无法使用。

我来解释一下:

  1. 当你点击按钮1时,它会发出一个叫做 toggled 的信号,然后执行你的 on_btn1_tgl_clicked() 方法。

  2. 在这个方法里,你使用了 gtk.ToggleButton.set_active(),这也会发出一个 toggled 的信号,接着调用你的 on_btn2_tg1_clicked() 方法,而这个方法也会发出一个 toggled 的信号。

    这样一来,我们就进入了一个无限循环。这就是为什么会出现这个错误的原因。

撰写回答