-1

この2つのコードがあります。最初のものは機能し、2 つ目は機能しません。すべての行にコメントを付け、次の行を導入するまでコードが機能することを確認しました。

d = yield viztask.waitDraw()

2番目のものでは、下で宣言され"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 )
4

1 に答える 1

0

その中から、標準の関数ではなく、ジェネレーター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(またはそれを反復しようとするまで) 何も実行されません。ジェネレーターをコールバック関数として使用しないようにするには、コードをリファクタリングする必要があります。

于 2014-10-03T10:34:07.530 に答える