Psychopy GetKeys 失败
Failure to Psychopy GetKeys
我的任务是设计一个方块。它会 运行 从屏幕的一侧随机到另一侧。有时会发出哔哔声。一听到嘟嘟声就必须按下按钮(这是键盘)。问题是,当我使用“getkeys”方法时,它总是 returns 一个空列表。 RT 显示它主要获取缓冲区中的第一个输入。我也试过eventclear,但是好像没用。
这是代码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from psychopy import visual, core, event,gui
from psychopy import sound as sd
#from psychopy.iohub.client.keyboard import Keyboard as kbd
import random, math,time
from psychopy.iohub import launchHubServer
import numpy as np
win = visual.Window(fullscr = False, size = [960,540], color = 'black', units = 'pix')
io = launchHubServer()
kbd = io.devices.keyboard
x,y = win.size
ran = [random.randint(-400,400),random.randint(-400,400),random.randint(-150,150),random.randint(-150,150)]
mode = random.randint(0,3)
start_pos = [[ran[mode],-269],[ran[mode],269],[-479,ran[mode]],[479,ran[mode]]]
rect = visual.Rect(win, width = 50, height = 50, fillColor='white', pos = start_pos[mode], name = 'target')
timer = core.Clock()
dx = [0,0,1,-1]
dy = [1,-1,0,0]
def present(rect,t):
timer.reset()
while timer.getTime() < t:
rect.draw()
win.flip()
def movement(rect,time):
event.clearEvents()
x,y = win.size
timer.reset()
timer_2 = core.Clock()
timer_2.reset()
jump = True
while timer.getTime() < time and (abs(rect.pos[0])< x/2 and abs(rect.pos[1])< y/2):
timeUse = timer_2.getTime()
timer_2.reset()
a,b = rect.pos
rect.pos += [dx[mode]*timeUse*100,dy[mode]*timeUse*100]
if int(timer.getTime()) == 3 :
if jump :
sd.Sound('D', octave = 5).play()
#print("D" , timer.getTime())
if jump :
timer_jump = core.Clock()
timer_jump.reset()
print(timer_jump.getTime(),'++++++++++')
event.clearEvents()
if timer.getTime() < time and jump :
print('============')
#k_1 = event.getKeys(keyList = ['a','z'])
while event.getKeys() is not None:
RT = timer_jump.getTime()
print(RT,'--------')
break
jump = False
#print([timer.getTime(),time])
#print(rect.pos)
rect.draw()
win.flip()
present(rect,1)
movement(rect,15)
如果有帮助,我会很感激。
Messhiro
The question is, when I use the "getkeys" method, it always returns an empty list.
event.getKeys()
是对键盘缓冲区的瞬时检查。它总是 return 一个空列表,除非自上次调用该函数以来按下了一个键。所以它通常在循环中调用,通常每次屏幕刷新一次,以检测何时发生按键。结果是它将 return 一个空列表多次,直到实际按下一个键。
但 PsychoPy 的 event
模块实际上已被弃用,取而代之的是更新的 Keyboard
class。这样做的好处是它 returns 是按键被按下的实际时间:当使用 event.getKeys()
时,只需从函数被调用的时间推断出反应时间。这是按下按键后的一段时间 - 即使您在每次屏幕刷新时调用该函数(通常为 60 Hz),这也会将时间分辨率限制为 16.7 毫秒。同时,Keyboard
class 在单独的进程中运行并不断检查键盘硬件,从而使精度达到毫秒级。
关于 Keyboard
class 的文档在这里:https://www.psychopy.org/api/hardware/keyboard.html
我的任务是设计一个方块。它会 运行 从屏幕的一侧随机到另一侧。有时会发出哔哔声。一听到嘟嘟声就必须按下按钮(这是键盘)。问题是,当我使用“getkeys”方法时,它总是 returns 一个空列表。 RT 显示它主要获取缓冲区中的第一个输入。我也试过eventclear,但是好像没用。
这是代码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from psychopy import visual, core, event,gui
from psychopy import sound as sd
#from psychopy.iohub.client.keyboard import Keyboard as kbd
import random, math,time
from psychopy.iohub import launchHubServer
import numpy as np
win = visual.Window(fullscr = False, size = [960,540], color = 'black', units = 'pix')
io = launchHubServer()
kbd = io.devices.keyboard
x,y = win.size
ran = [random.randint(-400,400),random.randint(-400,400),random.randint(-150,150),random.randint(-150,150)]
mode = random.randint(0,3)
start_pos = [[ran[mode],-269],[ran[mode],269],[-479,ran[mode]],[479,ran[mode]]]
rect = visual.Rect(win, width = 50, height = 50, fillColor='white', pos = start_pos[mode], name = 'target')
timer = core.Clock()
dx = [0,0,1,-1]
dy = [1,-1,0,0]
def present(rect,t):
timer.reset()
while timer.getTime() < t:
rect.draw()
win.flip()
def movement(rect,time):
event.clearEvents()
x,y = win.size
timer.reset()
timer_2 = core.Clock()
timer_2.reset()
jump = True
while timer.getTime() < time and (abs(rect.pos[0])< x/2 and abs(rect.pos[1])< y/2):
timeUse = timer_2.getTime()
timer_2.reset()
a,b = rect.pos
rect.pos += [dx[mode]*timeUse*100,dy[mode]*timeUse*100]
if int(timer.getTime()) == 3 :
if jump :
sd.Sound('D', octave = 5).play()
#print("D" , timer.getTime())
if jump :
timer_jump = core.Clock()
timer_jump.reset()
print(timer_jump.getTime(),'++++++++++')
event.clearEvents()
if timer.getTime() < time and jump :
print('============')
#k_1 = event.getKeys(keyList = ['a','z'])
while event.getKeys() is not None:
RT = timer_jump.getTime()
print(RT,'--------')
break
jump = False
#print([timer.getTime(),time])
#print(rect.pos)
rect.draw()
win.flip()
present(rect,1)
movement(rect,15)
如果有帮助,我会很感激。
Messhiro
The question is, when I use the "getkeys" method, it always returns an empty list.
event.getKeys()
是对键盘缓冲区的瞬时检查。它总是 return 一个空列表,除非自上次调用该函数以来按下了一个键。所以它通常在循环中调用,通常每次屏幕刷新一次,以检测何时发生按键。结果是它将 return 一个空列表多次,直到实际按下一个键。
但 PsychoPy 的 event
模块实际上已被弃用,取而代之的是更新的 Keyboard
class。这样做的好处是它 returns 是按键被按下的实际时间:当使用 event.getKeys()
时,只需从函数被调用的时间推断出反应时间。这是按下按键后的一段时间 - 即使您在每次屏幕刷新时调用该函数(通常为 60 Hz),这也会将时间分辨率限制为 16.7 毫秒。同时,Keyboard
class 在单独的进程中运行并不断检查键盘硬件,从而使精度达到毫秒级。
关于 Keyboard
class 的文档在这里:https://www.psychopy.org/api/hardware/keyboard.html