Функция Python (viztask.waitdraw)

У нас есть эти два кода. Первый работает, а второй нет. Мы прокомментировали все строки и убедились, что во втором код работает, пока не введем строку:

d = yield viztask.waitDraw()

Во втором он даже не печатает "collision", которая является первой строкой, даже если viztask.waitDraw() объявлено ниже.

Рабочая версия:

ball.enable(viz.COLLIDE_NOTIFY)
def onCollide(e):
        print('collision')
        global count 
        count = count+1
        print(count)

viz.callback( viz.COLLIDE_BEGIN_EVENT, onCollide )

def testReactionTime(threadName):
    print 'boolTime: '
    print(boolTime)
    while boolTime:
        #Wait for next frame to be drawn to screen
        d = yield viztask.waitDraw()
        #Save display time
        displayTime = d.time
        #Wait for keyboard reaction
        d = yield viztask.waitMouseUp(viz.MOUSEBUTTON_LEFT)
        #Calculate reaction time
        reactionTime = d.time - displayTime
        print(reactionTime)

Неработающая версия:

ball.enable(viz.COLLIDE_NOTIFY)
def onCollide(e):
        print('collision')
        global count
        if e.obj2 == beginning:
            #Wait for next frame to be drawn to screen
            d = yield viztask.waitDraw()
            #Save display time
            displayTime = d.time
            #viztask.schedule( testReactionTime("h"))
            print('start time')
        elif e.obj2 == end:
            global reactionTime
            d = yield viztask.waitDraw()
            reactionTime = d.time - displayTime
            print("count = ")
            print(count)
            print("time = ")
            print(reactionTime)
        else:
            count = count+1
            print(count)
viz.callback( viz.COLLIDE_BEGIN_EVENT, onCollide )

1 ответ

Когда ты yield изнутри вы поворачиваете onCollide в генератор, а не стандартная функция. Вот минимальный пример, чтобы продемонстрировать разницу:

>>> def func():
    s = "foo"
    print(s)
    return s

>>> f = func()
foo # print
>>> f
'foo' # returned value
>>> def gen():
    """Identical to the above, but with 'yield' instead of 'return'."""
    s = "foo"
    print(s)
    yield s


>>> g = gen()
# nothing happens here
>>> g
<generator object gen at 0x02F1C648> # nothing yielded yet
>>> h = next(g)
foo # print
>>> h
'foo' # yielded value

Вызов генератора устанавливает его, но на самом деле ничего не работает, пока вы не позвоните next (или иначе попытайтесь перебрать это). Вам придется реорганизовать свой код, чтобы избежать использования генератора в качестве функции обратного вызова.

Другие вопросы по тегам