Как я могу ждать двойного щелчка? - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу дождаться двойного щелчка, пока не появится следующий экран.Поэтому я создал переменную doubleclick, которая начинается с нуля, и +1 добавляется при каждом щелчке мышью.Как только дважды щелкнет мышь, цикл должен прекратиться.

def Instruction(x):
    """Function Instruction(x) presents instruction text in string x"""
    instrText.setText(x)
    myMouse.clickReset()
    doubleclick = 0
    while True:
        instrText.draw()
        myWin.flip()
        if myMouse.getPressed()[0]:
            doubleclick += 1
        if doubleclick == 2:
            myMouse.clickReset()
            break

Цикл останавливается после одного щелчка и вызывается следующий экран.

1 Ответ

0 голосов
/ 24 сентября 2019

Это потому, что цикл while выполняется тысячи раз в секунду, поэтому вам придется нажимать чрезвычайно быстро, чтобы myMouse.getPressed()[0] не возвращать True несколько раз подряд.

Это довольно ручной способ его кодирования.Неважно, будет ли второе нажатие, например, через 19 секунд после первого, или же они были нажаты в том же (приблизительном) месте.

def Instruction(x):
    """Function Instruction(x) presents instruction text in string x"""
    instrText.text = x
    myMouse.clickReset()
    instrText.draw()
    myWin.flip()

    # Wait for button press
    while not myMouse.getPressed()[0]:
        pass

    # Button was pressed, now wait for release
    while myMouse.getPressed()[0]:
        pass

    # Button was released, now wait for a press
    while not myMouse.getPressed()[0]:
        myMouse.clickReset()

    # The function ends here, right after second button down

Если вы хотите добавить критерий, что они должны быть нажаты в течениеза короткий промежуток времени вы бы добавили немного больше логики и отслеживания текущего состояния:

# Set things up
from psychopy import visual, event
import time
win = visual.Window()
myMouse = event.Mouse()

interval = 1.0  # window for second click to count as double
press_registered = False
release_registered = False

while True:
    # Get press time for first press in a potential double click
    if not press_registered and myMouse.getPressed()[0]:
        t_press1 = time.time()
        press_registered = True

    # Detect that the (potential first) click has finished
    if press_registered and not myMouse.getPressed()[0]:
        press_registered = False
        release_registered = True

    # If there has been a first click...
    if release_registered:
        # Listen for second click within the interval
        if time.time() - t_press1 < interval:
            if myMouse.getPressed()[0]:
                break
        # Time out, reset
        else:
            press_registered = False
            release_registered = False
...