Почему я получаю ошибку во время выполнения с двумя связанными кнопками переключения gtk? - PullRequest
2 голосов
/ 30 октября 2011

У меня есть две переключающие кнопки, которые я хочу связать вместе, чтобы при нажатии одной из них отпустилась другая.Так что мои сигналы выглядят так:

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 ]

2 голосов
/ 30 октября 2011

Когда я запускаю ваш код, я получаю это исключение:

RuntimeError: maximum recursion depth exceeded и кнопки не работают.

Мое объяснение:

  1. Когда вы нажимаете кнопку 1, она издает сигнал toggled и выполняет ваш on_btn1_tgl_clicked() метод.
  2. В этом методе вы используете gtk.ToggleButton.set_active(), который также испускает сигнал toggled, который вызывает ваш on_btn2_tg1_clicked() метод, который испускает также сигнал toggled.

    Итак, мы входим в бесконечный цикл. Вот почему возникает исключение.

1 голос
/ 30 октября 2011

Просто проверьте перед установкой состояния кнопки, имеет ли она уже состояние, в котором вы ее устанавливаете.

0 голосов
/ 31 октября 2011

Я решил эту проблему, установив вторую кнопку напротив первой, а не в противоположность ее текущему состоянию.Так что-то вроде

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)

Кажется, это не страдает от проблем рекурсии другого решения.

0 голосов
/ 31 октября 2011

Почему вы хотите изменять состояние кнопки каждый раз, когда она изменяется пользователем? Если вы хотите предотвратить изменение пользователя, используйте widget.set_sensitive(False). Или, если вы хотите предотвратить изменение состояния на основе некоторых условий, я думаю, вы можете вернуть True в on_btn1_tgl_clicked, чтобы сказать GTK «Я уже обработал это событие, поэтому вы не обрабатываете его сами», и GTK не изменит его состояние , Если вы вернете False или ничего, GTK обработает его и изменит его состояние.

...