使用ioHub的PsychoPy按键按下代码

1 投票
1 回答
1174 浏览
提问于 2025-04-18 18:30

我正在写一段代码,让用户可以通过上下箭头键来调整一条线的长度。

现在我已经可以让用户按下这些键来调整线的长度,但这样做太慢了,因为每次按下键时,线的长度只增加或减少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还是个新手:这个方法对我有效,但可能不是“正确”的做法)。

撰写回答