【发布时间】:2014-11-05 19:06:32
【问题描述】:
我正在设置一个菲茨定律实验,我希望参与者单击开始按钮,沿直线移动鼠标,然后单击目标。单击开始后,如果参与者在垂直方向上向上或向下移动鼠标太多,我想显示一个白屏 30 秒并且不接受任何输入,然后移动到下一个试验。
目前,无论如何,实验的行为都好像我超出了可接受的范围,并且总是执行 if 语句。
这是我现在拥有的代码:
from psychopy import core
start = mouse.isPressedIn(polygon, buttons=[0])
if start==True:
thisExp.addData('starttime',core.getTime())
x, y = mouse.getPos()
mouse.x.append(x)
mouse.y.append(y)
if y>10 or y<-10: #this is the statement that isn't resulting in what I would expect
thisExp.addData('penalty',1)
finish = mouse.isPressedIn(polygon2, buttons=[0])
if finish==True:
thisExp.addData('stoptime',core.getTime())
continueRoutine=False
我还没有弄清楚嵌套 if 语句下我需要的一切。现在我只是想确保它正常工作。即使查看 csv 文件中收集的 mouse.y 列表数据,它也不会将 if 语句评估为 true,也不会添加惩罚,我可以看到存在 y 超出我设置的任何范围的实例。
似乎在试验开始时就开始收集鼠标位置数据,而不是在单击多边形之后。但是,开始时间和停止时间似乎确实基于单击多边形和多边形2 的时间。我真的不确定发生了什么。
更新: 由于某种原因,直到一天后我才收到有关 Jonas 回复的通知。我希望我有,因为它会让我在几个小时前走上正确的轨道。它是一个构建器代码组件。
我的代码在每一帧都运行。在例程的开头我添加了:
checkstart = False
使用以下代码,每一帧都解决了这个特定问题:
start = mouse.isPressedIn(polygon, buttons=[0])
if start==True:
thisExp.addData('starttime',core.getTime())
x, y = mouse.getPos()
mouse.x.append(x)
mouse.y.append(y)
checkstart=True;
if checkstart==True:
if y>10 or y <-10:
thisExp.addData('penalty',1)
finish = mouse.isPressedIn(polygon2, buttons=[0])
if finish==True:
thisExp.addData('stoptime',core.getTime())
continueRoutine=False
我仍然不知道为什么在单击多边形之前会收集鼠标位置,但这对我来说并不重要。我可以将鼠标单击的帧的数据与开始按钮对应的位置进行匹配,以获取鼠标路径跟踪的开始。
【问题讨论】:
-
只是为了确定:这是在 Builder 代码组件中还是在完全基于代码的实验中?这里有一些想法/:(1)如果窗口是什么单位? 'norm'、'pix'、'deg' 还是别的什么? (2) 这段代码是在每一帧上运行还是在循环内运行?有这个背景会很好。请使用此信息更新问题,我们会解决的。
-
感谢您的评论。你肯定在考虑正确的事情。
-
酷!您可以在 StackOverflow 上回答您自己的问题,因此请考虑将上面的答案复制粘贴到下面的答案并接受您自己的答案。那么很明显这个问题已经解决了。将来遇到同样问题的人会在这里以很好的问答形式找到答案:-)
-
优化代码的提示:导入核心应该在实验开始时完成。它会在整个实验过程中一直存在,就像
checkstart对例程所做的那样。
标签: python mouseevent psychopy