【问题标题】:Python/Psychopy: Logging mouse click locationsPython/Psychopy:记录鼠标点击位置
【发布时间】:2017-06-05 04:28:38
【问题描述】:

使用下面的代码,我试图打开一个窗口 10 秒,让用户根据需要多次单击屏幕上的任意位置,并且我想记录鼠标单击的位置。每次用户在窗口内单击(即 myMouse.getPressed)时,我都会将单击位置附加到列表中(mouse_click_locations[])。但是,该列表在每一帧上都多次附加了相同的单击位置。我想将单击位置附加到列表一次,直到启动另一次单击为止。我认为在每一帧的末尾添加“myMouse.clickReset()”可以做到这一点,但这并没有什么不同。

10 秒后,我希望每次启动鼠标单击时,列表都填充一个位置(x,y 坐标)。

from psychopy import visual, core, gui, event, sound

win = visual.Window([800,600],color=(1,1,1), colorSpace='rgb', 
rgb=None, allowGUI=True, monitor='testMonitor', 
units='deg', fullscr=False)

myMouse = event.Mouse(visible=True,win=win)

refresh_rate = 60.0
default_time = 10

time_window = default_time * refresh_rate
time_window = int(time_window)

running = 1
while running:

    mouse_click_locations = []

    for frame in range(time_window):

        mouse_loc = myMouse.getPos()
        mouse_click = myMouse.getPressed()

        if mouse_click:
            mouse_click_locations.append(mouse_loc)

        win.flip()
        myMouse.clickReset()

    running = 0

win.close()

print mouse_click_locations

有人可以帮助我实现这一目标吗?我是否错误地使用了 myMouse.clickReset()?

干杯, 乔恩

【问题讨论】:

  • 您的问题也在discourse.psychopy.org/t/logging-mouse-click-locations/2566PsychoPy 是一个小社区,请不要重复发帖浪费人们的时间。
  • 抱歉,我没有发现问题,因为它是两个独立的网站。我从多个角度认为是一件好事。今后将不再使用。
  • 没问题,该评论更多地是作为未来海报的指南,如果它看起来更像是一种责备,对不起。同一个人倾向于在每个站点上提供答案,因此我们倾向于让人们选择最合适的地点并在那里询问。 SO 适用于具有明确答案的基于代码的问题,discourse.psycho.org 更适用于图形生成器界面,和/或需要更多对话而不是单一问题/答案格式的问题。
  • 啊,非常有道理!干杯迈克尔。

标签: python psychopy


【解决方案1】:

发生这种情况是因为脚本会检查帧循环中每次迭代的鼠标状态;即每秒60次。正如您所说,您只想为每次鼠标按下获得一个事件。这是一种解决方案,您只需停止脚本,直到所有按钮都被释放。另请注意使用any 明确检查所有按钮。

# Record mouse position if a key is pressed
if any(myMouse.getPressed())  # Any button pressed, no matter which
    mouse_click_locations.append(myMouse.getPos())

# Wait until all buttons are released
while any(myMouse.getPressed()):
    pass

无需使用mouse.clickReset。作为一个小评论,您不会更新屏幕上的视觉内容,因此您不需要在循环中包含win.flip。因为它等待下一次监视器更新,所以它有效地将反应时间(如果您需要这些)四舍五入到最接近的 1/60 秒间隔。这一点,并且稍微依赖于默认值,也会大大简化脚本:

default_time = 10

from psychopy import visual, core, event    
win = visual.Window(color='white', monitor='testMonitor', units='deg')
myMouse = event.Mouse(visible=True, win=win)
clock = core.ClocK()

# Collect unique click events before time runs out
mouse_click_locations = []
while clock.getTime() < default_time:
    # Record mouse position if a key is pressed
    if any(myMouse.getPressed())  # Any button pressed, no matter which
        mouse_click_locations.append(myMouse.getPos())

    # Wait until all buttons are released
    while any(myMouse.getPressed()):
        pass

print mouse_click_locations

【讨论】:

  • 乔纳斯,感谢您提供的信息丰富且很有帮助的回复。出于某种奇怪的原因,我对 for 循环很感兴趣。你的 while 循环方法看起来好多了。
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多