使用Psychopy鼠标选择图像

时间:2017-10-02 18:54:17

标签: python-2.7 mouseevent psychopy

我在Psychopy中创造了两个刺激(红色和绿色矩形)作为刺激。此外,我已启用鼠标移动到四个方向。使用Psychopy中的[mouse.getPressed()]函数来选择刺激,我面临一些问题。 基本上,我希望鼠标在四个方向上移动,当鼠标到达红色/绿色矩形刺激时,我需要选择刺激并将其颜色更改为蓝色。

任何人都可以调查此问题并帮我解决问题吗?

这是我的代码:

from psychopy import visual, core, event 
import numpy as np


# Create a window.
# For configuring and debugging the code turn off full screen.
fullscr = False
win = visual.Window(
    [1200,1000],
    monitor="testMonitor",
    units="deg",
    fullscr=fullscr
    )

#cursor = visual.Circle(win, radius=0.2)

#cursor = visual.CustomMouse(win,
#    leftLimit=-10, topLimit=10, rightLimit=10, bottomLimit=-10,
#    showLimitBox=True, clickOnUp=True)

pos_zero = (0, 0)
cursor = visual.Rect(
        win=win, 
        size=400,
        pos=pos_zero,
        opacity=0
        )

mouse = event.Mouse(visible=True)


# Sinusoidal control version.
freq_one = 0.5
freq_two = 1.5
# Colors of the rectangles.
#color_zero='black'
color_one = 'red'
color_two = 'green'
# Positions of the rectanges.
pos_one = (-10, 0)
pos_two = (10, 0)


start = core.getTime()
cnt = 0
cursor.pos = mouse.getPos()
print cursor.pos
while cnt<600:
    second = core.getTime() - start

    sin_val_one = 0.5+0.5*np.sin(2 * np.pi * second * float(freq_one))
    sin_val_two = 0.5+0.5*np.sin(2 * np.pi * second * float(freq_two))

#while not mouse.getPressed()[0]:
    # Do something if mouse moved

    for key in event.getKeys():
        if key == 'escape': 
           core.quit()
        elif key == "right":
           cursor.pos = cursor.pos + (2,0)
        elif key =="left":
           cursor.pos = cursor.pos - (2,0) 
        elif key =="up":
           cursor.pos = cursor.pos + (0,2) 
        elif key =="down":
           cursor.pos = cursor.pos - (0,2) 


        #if cursor.pos == pos_one:
        #   mouse.getpressed(rect_one)
        #elif cursor.pos == pos_two:
        #   mouse.getpressed(rect_two)

    mouse.setPos(cursor.pos)  
    mouse.lastPos = cursor.pos  

    rect_one = visual.Rect(
        win=win,
        fillColor=color_one,
        lineColor=color_one, 
        size=15,
        pos=pos_one,
        opacity=sin_val_one
        )
    rect_two = visual.Rect(
        win=win,
        fillColor=color_two,
        lineColor=color_two, 
        size=15,
        pos=pos_two,
        opacity=sin_val_two
        )

#images = [rect_one, rect_two]

#for image in images:
#    if mouse.isPressedIn(image):
#        pressed_shape = shape
#            
#    pressed_image.fillColor = 'blue'
#    pressed_image.draw()
#    print pressed_image.name

    rect_one.draw()
    rect_two.draw()
    cursor.draw()
    win.flip()
    cnt += 1

win.close()

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我做了一些更改,并在下面发布了更新的代码。它明显更短更简单。

  • 使用鼠标删除所有内容。由于你只想要一些视觉效果在按键上移动,所以不需要调用鼠标 - 特别是当你实际上不希望对象使用鼠标时......

  • 创建一次彩色形状,然后在运行时更新颜色。这明显更快,即避免丢帧。

  • 更改了光标大小。它是400度!

  • 删除了矩形周围的线条,以便在重叠时只需要更改fillColor

  • 其他一些简化。

以下是代码:

from psychopy import visual, core, event 
import numpy as np

# Settings
fullscr = False
directions = {'left': (-2,0), 'right': (2,0), 'up': (0, 2), 'down': (0, -2)}
freq_one = 0.5  # # Sinusoidal control
freq_two = 1.5

# Create a window.
win = visual.Window([1200,1000], monitor="testMonitor", units="deg", fullscr=fullscr)

# The two rectangles
rect_one = visual.Rect(win=win, fillColor='red', lineColor=None, size=15, pos=(-10, 0))
rect_two = visual.Rect(win=win, fillColor='green', lineColor=None, size=15, pos=(10, 0))

# Cursor
cursor = visual.Circle(win, fillColor='white', radius=0.2)

# Run five trials
for trial in range(5):
    # Set to initial condition
    rect_one.fillColor = 'red'
    rect_two.fillColor = 'green'
    cursor.pos = (0, 0)

    # Start task
    start = core.getTime()
    for frame in range(600):
        # Set rectangle opacities
        second = core.getTime() - start
        rect_one.opacity = 0.5+0.5*np.sin(2 * np.pi * second * float(freq_one))
        rect_two.opacity = 0.5+0.5*np.sin(2 * np.pi * second * float(freq_two))

        # Show it
        rect_one.draw()
        rect_two.draw()
        cursor.draw()
        win.flip()

        # Get keyboard responses and change color if there is overlap
        for key in event.getKeys():
            if key == 'escape': 
               core.quit()
            elif key in directions.keys():  # if this is a key corresponding to a direction
               cursor.pos += directions[key]   # Lookup the pos change in "directions" and add it to current position
               if cursor.overlaps(rect_one):
                   rect_one.fillColor = 'blue'
               if cursor.overlaps(rect_two):
                   rect_two.fillColor = 'blue'