2016-08-14 3 views
3

Это мой первый вопрос здесь в 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, просто спросить за них, но я не думаю, что они будут помогать ...)

+0

Обработчик события 'Hi' вызывается каждый раз, когда переключатель переключается. Поскольку вы переключаете переключатель _inside_ обработчик события, вы, очевидно, заканчиваете бесконечным циклом. –

+0

Есть ли безопасный способ достичь моей главной цели? Активировать его -> * На поиск ошибки -> * Деактивировать его EDIT: Вы говорите, что «switchie.connect()» также ссылается на вызовы switchie.set_active()? – PythonNoob

+1

Да, обработчик сигнала вызывается независимо от _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). –

ответ

1

Вы хотите подключить переключатель, как это :

switchie.connect("""activate""", Hi)

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

def Hi(switch, active):

к

def Hi(switch, active = None):

для поддержки клавиатуры.

+0

Ничего себе. Я немного впечатлить две вещей: * Это было долгое время, так как я спросил это * Я бросил эти настройки уже немного proyect моего XDDD В любом случае, спасибо. Я попытаюсь воссоздать свою ситуацию и попробовать этот ответ. Кстати, В моем последнем проекте я фактически использовал сигнал «активировать» с некоторыми другими виджетами. (Как я забыл про мой старый проект, я не заметил, что это может решить мою проблема ...) НО У меня есть вопрос: * Есть ли другая разница между «notify :: active» и «activate» в стороне от «бесконечного» цикла, который создается первым? – PythonNoob

+0

И почти забыл упомянуть: * Что вы имеете в виду под «поддержкой клавиатуры»? Поддержка «что»? Подключения клавиатуры? Ярлыки? Сфокусировать переключатель? Ускорители? – PythonNoob

+0

Да, «уведомлять :: активный» вызывается ** после ** коммутатор активируется/неактивен, что создает цикл. «Активировать» вызывается, когда пользователь отвечает на коммутатор, поэтому он вызывается только один раз для каждого взаимодействия между пользователем и коммутатором, и сигнал вызывается ** перед **, когда коммутатор становится активным/неактивным. Поддержка клавиатуры означает, что если переключатель имеет фокус, вы можете нажать enter на клавиатуре, чтобы активировать/деактивировать его. – theGtknerd