Функция 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
(или иначе попытайтесь перебрать это). Вам придется реорганизовать свой код, чтобы избежать использования генератора в качестве функции обратного вызова.