我正在尝试编写一个代码,用户可以在其中使用向上和向下箭头键调整行的长度。
我可以让用户通过按下它们来调整线条,但这需要很长时间,因为我有它,所以长度增加(如果按下向上键)或减少(如果按下向下键)每按一次键 1 个像素。
我想知道是否有人知道如何在按住键时调整线的长度,并在释放键后停止调整该线?
我一直在玩不同的 ioHub 功能,但无法弄清楚。
我尝试将它基于按键的持续时间,但直到按键被释放后才会报告持续时间,因此用户无法查看他们在按住按键时如何调整线路。
有没有人有什么建议?
此答案假设您使用的是 PsychoPy 的 Builder 界面。但是您也可以将相同的代码片段放在 Coder 界面中的适当位置。
我假设您有一个 Line 组件,并且它的大小以标准化单位指定。现在插入一个 Code 组件(创建后,右键单击它并将其移动到 Line 组件上方,以便立即应用对 Line 对象的更改,而不是在下一次屏幕刷新时应用)。
在代码组件的“开始实验”选项卡中,输入以下代码来初始化 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 Hz 的频率运行,这就是更新行大小的速率。
# 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 的新手:这对我有用,但可能不是“正确”的方法)。