Это мой первый вопрос здесь в StackOverflow, поэтому, пожалуйста, будьте терпеливы со мной, если некоторая информация отсутствует или я пропустил что-то важное, но в любом случае я сделаю все :)Некоторые вопросы о коммутаторах питона
Недавно я начал код в Python2.7, поэтому я не очень хорошо разбираюсь в этом. Во время игры с PyGtk, PyGObject, Glade и т. Д. Я нашел что-то особенное в отношении переключателей (не пробовал ни с каким другим виджетами, поэтому я не знаю, происходит ли это где-то в другом месте. Скорее всего, это не так, надеюсь ...)
Я сделал очень простой графический интерфейс с одного «окна» плюс «переключатель» с помощью Glade
Моя цель в том, чтобы отключить переключатель после пользователь пытался активировать его, если некоторые Exeption поднял раньше, что-то вроде:
- Активируйте его -> * Заметили ошибку -> * дезактивировать его
Я сделал некоторый код, и через некоторое время, я заметил, что этот кусок кода создан блок зацикливания, как, после блокировки окна графического интерфейса в:
builder = Gtk.Builder()
window1 = builder.get_object('window')
switchie = builder.get_object('switchie')
switchie.set_active(False)
def Hi(switch, active):
print switchie.get_active()
switchie.set_active(not switchie.get_active())
switchie.connect("""notify::active""", Hi)
window1.set_position(Gtk.WindowPosition.CENTER)
window1.connect("delete-event", Gtk.main_quit)
window1.show_all()
Если я прав, «switchie.connect» связывает объект «switchie» с «Привет» func всякий раз, когда нажимается «switchie».
Но если я это выполнил и попытаюсь включить, GUI зависает. Я пытаюсь выполнить это с помощью сценария & командной строки и добавления «переключатель состояния печати», в результате чего в бесконечном цикле (True & False)
Я пытался со многим другим funcs я сделал, но ни один из них не может решить Эта проблема. На самом деле, это «сущность» всех других функций, которые я сделал.
Почему это происходит?
Где петля?
Я ошибаюсь в какой-то строке?
Помощь приветствуется!
(Если вам нужно, чтобы увидеть остальную часть моего неисправного funcs, просто спросить за них, но я не думаю, что они будут помогать ...)
Обработчик события 'Hi' вызывается каждый раз, когда переключатель переключается. Поскольку вы переключаете переключатель _inside_ обработчик события, вы, очевидно, заканчиваете бесконечным циклом. –
Есть ли безопасный способ достичь моей главной цели? Активировать его -> * На поиск ошибки -> * Деактивировать его EDIT: Вы говорите, что «switchie.connect()» также ссылается на вызовы switchie.set_active()? – PythonNoob
Да, обработчик сигнала вызывается независимо от _why_ изменяется состояние переключателя. Если вы должны переключить переключатель внутри обработчика событий, вам придется временно [отключить] (https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-handler-disconnect) или [block] (https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-handler-block). –