Невозможно прервать сценарий психоанализа, event.getKeys() всегда пустой

Я новичок в психопи и питоне. Я пытаюсь запрограммировать способ выхода из сценария (который я не писал), например, нажав клавишу. Я добавил это в цикл while:

while n < total
  start=time.clock()
  if len(event.getKeys()) > 0:
    break
  # Another while loop here that ends when time is past a certain duration after 'start'.

И он не работает, он не регистрирует нажатия клавиш. Поэтому я предполагаю, что нажатия клавиш регистрируются только в определенное время. Что это за времена? Что требуется для регистрации нажатий клавиш? Этот цикл очень быстрый, он отправляет сигналы каждые несколько миллисекунд, поэтому я не могу просто добавить команды ожидания в цикл.

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

Спасибо!

Правки: в противном случае код работает так, как ожидалось (в частности, без ошибок). «ядро» и «событие» включены. Нет никакой другой команды «события», которая могла бы повлиять на «журнал нажатия клавиш».

Изменение остального содержимого цикла на то, что включает операторы core.wait, заставляет его работать. Итак, для всех, у кого есть эта проблема, мое первоначальное предположение было верным: нажатия клавиш не регистрируются в часы занятости (т.е. в моем случае оператор while, который постоянно проверяет время) или, возможно, только в определенные часы занятости... больше знаний может прояснить.


person zorgkang    schedule 02.10.2014    source источник
comment
Вызываете ли вы event.getKeys() в другом месте цикла while? Если вы это сделаете, он удалит все события, и это объясняет len=0.   -  person Jonas Lindeløv    schedule 03.10.2014
comment
Добавил несколько деталей в вопрос. Краткий ответ: нет.   -  person zorgkang    schedule 03.10.2014
comment
Если core.wait() помогает, попробуйте также window.flip() (при условии, что вы создаете объект visual.window). Если все это работает, вы можете написать ответ на ваш вопрос. Я не знаю внутренностей психопии, поэтому не буду строить догадки, почему у вас возникают эти проблемы. Однако имейте в виду, что core.wait() обычно рекомендуется использовать в узких циклах, чтобы позволить операционной системе дышать и, таким образом, избежать ее вторжений в непредвиденное время.   -  person mmagnuski    schedule 04.10.2014
comment
@Impon Импульсы отправляются каждые несколько миллисекунд, так что слишком быстро для window.flip(). И я надеялся на конкретный ответ на вопрос: когда регистрируются нажатия клавиш? У меня есть только очень частичный ответ, основанный на примерно часовом опыте работы с PsychoPy ... Кроме того, хороший совет, чтобы дать циклу дышать, эта версия действительно имеет для меня гораздо больше смысла.   -  person zorgkang    schedule 04.10.2014
comment
Еще одна идея: можно ли получить нажатия клавиш, если заменить event.getKeys() на event.waitKeys()? Он должен остановить все и дождаться любого нажатия клавиши. Если нет, попробуйте запустить Coder --› demo --› ввод, чтобы увидеть, работают ли они. Если они этого не делают, это, вероятно, что-то о вашей системе. Если они работают, я довольно невежественный здесь. event.getKeys() возвращает список названий ключей с момента последнего вызова event.getKeys() или с момента загрузкиPsychopy.event.   -  person Jonas Lindeløv    schedule 04.10.2014
comment
@Jonas Демонстрация ввода работает, и снова она работает с core.wait. Как вы сказали, waitKeys будет ждать, так что нет причин думать, что это не сработает. Очевидно, ключевые события не регистрируются или буферизуются где-то в системе, пока она занята. Я мог бы исследовать это поведение дальше, но у меня, честно говоря, нет времени... поэтому я попросил здесь мнение эксперта. Если кто-то хочет попробовать, бесконечный (или очень длинный) цикл с оператором if, как в моем посте, должен быть достаточным, чтобы воспроизвести то, что я видел. Возможно, клавиатура PS2 может работать там, где USB не работает. Не знаю, что у меня было на работе.   -  person zorgkang    schedule 05.10.2014


Ответы (2)


.... Так что я предполагаю, что нажатия клавиш регистрируются только в определенное время. Что это за времена? Что требуется для регистрации нажатий клавиш?....

Чтобы попытаться ответить на ваш конкретный вопрос, функции/методы API-интерфейсаPsychopy, которые вызывают регистрацию событий клавиатуры, ( теперь обновлены, чтобы сделать это буквально каждой функцией API-интерфейса 1.81 ):

  • событие.waitKeys()[1]
  • событие.clearEvents()[1]
  • событие.getKeys () [2]
  • событие.Mouse.getPressed()
  • выиграть.flip()
  • ядро.ждите()
  • Visual.Window.dispatchAllWindowEvents()

1: Эти функции также удаляют все существующие события клавиатуры из списка событий. Это означает, что любой будущий вызов такой функции, как getKeys(), будет возвращать событие клавиатуры только в том случае, если оно произошло после последнего вызова одной из этих функций.

2: Если keyList=None, делает то же самое, что и *, в противном случае удаляет ключи из списка ключевых событий, которые находятся в kwarg keyList.

Обратите внимание, что один из случаев, когда события клавиатуры «отправляются», происходит в самом вызове event.getKeys(). По умолчанию эта функция также удаляет любые существующие ключевые события.

Итак, не видя полного источника упомянутого вами внутреннего цикла, весьма вероятно, что event.getKeys() никогда не возвращает ключевое событие, потому что ключевые события потребляются каким-то другим вызовом во внутреннем цикле. Таким образом, вероятность того, что событие находится в списке ключей, когда вызывается внешний метод getKeys(), очень мала.

Обновление в ответ на комментарий OP к тестовому сценарию Джонаса (у меня пока недостаточно представителей, чтобы добавлять комментарии к ответам):

... Странно, что вы говорите, что это ... [пример кода jonas].. работает, и, судя по ответу Сола, кажется, что не должно. - Зоргканг

Возможно, мой ответ дает неправильное понимание, поскольку он предназначен для предоставления информации, которая точно показывает, почему пример Йонаса должен и работает. Пример кода Йонаса работает, потому что ключевые события удаляются из буфера событий только тогда, когда вызывается getKeys(), и любые удаленные события также возвращаются функцией, что приводит к разрыву цикла.

person Sol Simpson    schedule 23.10.2014
comment
Если это правильно, то код внутреннего цикла не должен иметь значения, кроме того факта, что он не содержит ни одного из них. Но, судя по примеру Йонаса, могут быть и другие, которые должны быть в этом списке, может быть, «пройдено»? - person zorgkang; 23.10.2014

Это не совсем ответ. Вот попытка минимально воспроизвести ошибку. Если окно закрывается при нажатии клавиши, это успех. Это работает для меня, поэтому я не смог воспроизвести его. Работает ли это для вас?

from psychopy import event, visual, core
win = visual.Window()
clock = core.Clock()
while True:
    clock.reset()
    if event.getKeys():
        break

    while clock.getTime() < 1:
        pass

У меня не установлен модуль time, поэтому вместо него я использовал psychopy.core.Clock(), но это не должно иметь значения, если только ваш временной код не заканчивается бесконечным циклом, поэтому event.getKeys() запускается только один раз через несколько микросекунд.

person Jonas Lindeløv    schedule 06.10.2014
comment
Не знаю почему, но я никогда не получал уведомления об этом ответе. Я сомневаюсь, что у меня будет возможность попробовать это в ближайшее время, но код не выполнял бесконечный цикл, он работал, как и ожидалось, и выдавал импульс на итерацию внешнего цикла. Странно, что вы говорите, что это работает, и из ответа Сола кажется, что не должно... - person zorgkang; 23.10.2014