0

読み取るファイルに16行あるため、16回実行されるループがあります。ループを使用して、特にタイムスタンプの最初の2文字を読み取ります。しかし、n変数が17に到達しないようにする方法がわかりません。nを16に制限する条件を使用しようとしましたが、役に立ちませんでした。これが私の関数全体です。http: //calicoproject.org/Calico_Python_GISで詳しく説明されているように、ハリケーンIreneのパスをアニメーション化しようとしています。

def drawIrene(win):
line = Line()
n = 0
for (x,y) in dots:
    time_stamp[n] = time_stamp[n][:2]
    time_stamp[n+1] = time_stamp[n+1][:2]
    time1 = abs(int(time_stamp[n]) - 12)
    time2 = abs(int(time_stamp[n+1]) - 12)
    wait_time = abs(int(time1) - int(time2))
    x, y = ll2xy(x, y)
    c = Circle(Point(x, y), int(eye_size[n]))
    line.append(Point(x,y))
    c.fill = Color(255, 255, 0, 62)
    c.draw(win)
    t = Polygon((x, y), (x+10, y+5), (x+int(movement_speed[n]), y-int(movement_speed[n])/2))
    t.fill = Color("orange")
    t.draw(win)
    print(time1)
    print(time2)
    print()
    #print (wait_time)
    wait(wait_time)
    if n < len(dots):
        n += 1
    else:
        break
line.draw(win)
line.border = 2
4

1 に答える 1

1

問題は、同じ長さの2つのシーケンスとをループしていることdotsですtime_stamptime_stampただし、値を計算するために現在のアイテムと次のアイテムの両方にアクセスして、シーケンスを先読みしていwait_timeます。インデックスがリストの最後を指しているIndexErrorため、これがループの最後のパスを引き起こしています。n+1

これを修正する方法はいくつかあります。データ構造を変更して、dots要素が1つ少なくなるように、または要素がtime_stamp1つ多くなるようにすることができます。または、コメントで提案されているように、ループを1回少なくすることもできます。

wait_timeしかし、最善の解決策は、ループ内のロジックを変更して、最初または最後のサイクルで異なる方法で計算することだと思います。たとえば、最後のサイクルで遅延を発生させないことを選択できます。

これがまさにそれを行うコードです。これは、最後のパススルーの特殊なケースであり、nはに等しく、その場合はlen(time_stamp)-1単にwait_timeゼロに設定されます。nループ内の組み込みenumerate関数から生成してforいるため、ゼロに初期化したり、手動で更新したりする必要はありません。

for n, (x, y) in enumerate(dots):
    if n < len(time_stamp)-1:
        time_stamp[n] = time_stamp[n][:2]
        time_stamp[n+1] = time_stamp[n+1][:2]
        time1 = abs(int(time_stamp[n]) - 12)
        time2 = abs(int(time_stamp[n+1]) - 12)
        wait_time = abs(int(time1) - int(time2))
    else: # special case n >= len(time_stamp)-1, which should be the last pass
        wait_time = 0
    x, y = ll2xy(x, y)
    c = Circle(Point(x, y), int(eye_size[n]))
    line.append(Point(x,y))
    c.fill = Color(255, 255, 0, 62)
    c.draw(win)
    t = Polygon((x, y), (x+10, y+5),
                (x+int(movement_speed[n]), y-int(movement_speed[n])/2))
    t.fill = Color("orange")
    t.draw(win)
    wait(wait_time)
于 2012-12-25T00:58:45.997 に答える