使用ioHub的PsychoPy按键按下代码
我正在写一段代码,让用户可以通过上下箭头键来调整一条线的长度。
现在我已经可以让用户按下这些键来调整线的长度,但这样做太慢了,因为每次按下键时,线的长度只增加或减少1个像素。
我想知道有没有人知道如何在按住某个键的时候调整线的长度,并在松开键的时候停止调整?
我尝试过使用不同的ioHub功能,但一直没能搞明白。
我试着根据按键的持续时间来调整,但持续时间只有在松开键后才会被报告,所以用户在按住键的时候看不到线的调整情况。
有没有人有什么建议?
1 个回答
1
这个回答是针对使用PsychoPy的Builder界面的。不过,你也可以在Coder界面里把相同的代码放在合适的位置。
我假设你已经有了一个线条组件,并且它的大小是用标准化单位来指定的。现在插入一个代码组件(创建后,右键点击它,把它移动到线条组件的上面,这样对线条对象的修改会立即生效,而不是等到下次屏幕刷新时才生效)。
在代码组件的“实验开始”标签里,放入这段代码来初始化ioHub,并为线条的缩放因子创建一个初始值(默认值为零):
from psychopy.iohub import launchHubServer, EventConstants
io=launchHubServer(experiment_code='key_evts', psychopy_monitor_name='default')
keyboard = io.devices.keyboard
increment = [0, 0] # initial value of scaling factor
然后在“每帧”标签里,我们会检查按键是否被按下。所以如果你的屏幕刷新率是60赫兹,那么线条的大小就会以这个频率更新。
# check the keyboard
for event in keyboard.getEvents():
if event.type == EventConstants.KEYBOARD_PRESS:
# a key has been pressed. This is reported only once, so set the value
# of the scaling factor to be used until the key is released:
if event.key == u'UP':
increment = [0.01, 0] # make it 1% of screen half-width longer
elif event.key == u'DOWN':
increment = [-0.01, 0] # make 1% shorter
if event.type == EventConstants.KEYBOARD_RELEASE:
# the key is no longer being pressed, so stop changing the size:
increment = [0, 0]
# regardless of what key is/isn't pressed, apply the current
# scaling factor on every screen refresh
line.size += increment
希望这对你有帮助。(我对使用ioHub还是个新手:这个方法对我有效,但可能不是“正确”的做法)。