turtle.left()だけじゃない!Pythonタートルグラフィックスの多様な回転方法

2025-06-06

以下に詳しく説明します。

  • turtle.left(angle):

    • この関数は、タートルが現在向いている方向から反時計回り(左方向)に指定された角度だけ回転させます。
    • angle には、回転させたい角度を数値(整数または浮動小数点数)で指定します。単位は度数です。
    • 例:
      • turtle.left(90): タートルを左に90度回転させます。
      • turtle.left(45): タートルを左に45度回転させます。
  • タートルグラフィックス (Turtle Graphics): Pythonの標準ライブラリに含まれるモジュールで、画面上に「タートル」と呼ばれる小さなカーソルを動かすことで図形を描画することができます。子供向けのプログラミング学習によく使われますが、シンプルなグラフィックを描く際にも便利です。

使用例

import turtle

# 画面とタートルをセットアップ
screen = turtle.Screen()
t = turtle.Turtle()

# 初期状態(右を向いている)から前進
t.forward(100) # 100ピクセル前進

# 左に90度回転
t.left(90)

# 回転した方向へ前進
t.forward(100)

# 左に45度回転
t.left(45)

# 再び前進
t.forward(100)

# 画面を閉じるクリックを待つ
screen.exitonclick()


AttributeError: 'module' object has no attribute 'left' または AttributeError: 'Turtle' object has no attribute 'left'

よくある原因

  • ファイル名がturtle.pyになっている
    自分のPythonスクリプトのファイル名をturtle.pyとすると、Pythonは標準ライブラリのturtleモジュールではなく、**自分の作ったturtle.pyをインポートしようとします。**その結果、left()メソッドが見つからずにエラーになります。これは非常に頻繁に起こる間違いです。

  • タートルオブジェクトを作成し忘れている
    turtle.Turtle()のようにして、実際にタートルを生成していないと、left()メソッドを呼び出す対象がありません。

    • 誤った例
      import turtle
      # t = turtle.Turtle() を忘れている
      t.left(90) # エラー
      
  • モジュール名を間違えている (大文字/小文字の間違い)
    turtle.left()を使用する際に、turtleモジュール自体を呼び出しているのではなく、作成したタートルオブジェクトに対してメソッドを呼び出す必要があります。

    • 誤った例
      turtle.left(90)import turtleだけの場合)
    • turtleモジュールは、Turtleクラスを持っていますが、left()メソッドはTurtleクラスのインスタンス(オブジェクト)のメソッドです。

トラブルシューティング

  • ファイル名の確認
    自分のスクリプトのファイル名がturtle.pyになっていないか確認し、もしそうであれば、例えばmy_drawing.pyのように別の名前に変更してください。

  • タートルオブジェクトの生成と利用を徹底する

    import turtle
    
    # タートルオブジェクトを作成する
    t = turtle.Turtle() 
    
    # 作成したタートルオブジェクトに対してメソッドを呼び出す
    t.left(90) 
    t.forward(100)
    

TypeError: left() missing 1 required positional argument: 'angle'

よくある原因

  • left()に引数(角度)を渡していない
    turtle.left()メソッドは、どれだけ回転させるかを指定する角度の引数を必要とします。

トラブルシューティング

  • 角度を数値で指定する
    import turtle
    t = turtle.Turtle()
    t.left(90) # 正しい例
    # t.left() # これはエラー
    

タートルが動かない、画面が表示されない、またはすぐに閉じてしまう

よくある原因

  • プログラムの終了処理が不足している
    タートルグラフィックスのウィンドウは、プログラムが終了すると自動的に閉じてしまいます。ユーザーがウィンドウを閉じるまで表示を維持するためには、適切な終了処理が必要です。

トラブルシューティング

  • turtle.done() または turtle.mainloop() または screen.exitonclick() を使用する

    • turtle.done(): プログラムが終了するまでタートルグラフィックスのウィンドウを開いたままにします。
    • turtle.mainloop(): turtle.done() と同じ働きをします。
    • screen.exitonclick(): ウィンドウがクリックされるまでプログラムを一時停止し、クリックされるとウィンドウが閉じます。
    import turtle
    
    t = turtle.Turtle()
    t.forward(100)
    t.left(90)
    t.forward(100)
    
    # 以下のいずれかを追加
    turtle.done()
    # または
    # screen = turtle.Screen()
    # screen.exitonclick()
    

よくある原因

  • 複数のタートルを扱っている際の混同
    複数のタートルオブジェクトを作成している場合、どのタートルがどのコマンドを実行しているか混乱することがあります。
  • 角度の指定ミス
    left()は反時計回りに回転します。時計回りに回転させたい場合はright()を使用するか、left(-角度)のように負の値を指定する必要があります。

トラブルシューティング

  • 描画を分割して確認する
    一度に複雑な描画を行うのではなく、部分的に実行して意図した動きになっているか確認する。
  • コードをステップ実行またはデバッグする
    エディタのデバッグ機能を使って、各行が実行されたときにタートルの状態がどうなるかを確認すると、間違いに気づきやすくなります。
  • 回転方向を確認する
    • 左に90度回転: t.left(90)
    • 右に90度回転: t.right(90) または t.left(-90)


例1:簡単な四角形を描く

最も基本的な例として、turtle.left()を使って四角形を描いてみましょう。

import turtle

# 画面とタートルオブジェクトの作成
screen = turtle.Screen() # 描画する画面を作成
t = turtle.Turtle()     # タートルを作成

# 四角形を描く
t.forward(100) # 100ピクセル前進
t.left(90)     # 左に90度回転(上を向く)
t.forward(100) # 100ピクセル前進
t.left(90)     # 左に90度回転(左を向く)
t.forward(100) # 100ピクセル前進
t.left(90)     # 左に90度回転(下を向く)
t.forward(100) # 100ピクセル前進

# 画面がすぐに閉じないようにする
screen.exitonclick() # 画面をクリックするまで閉じない

解説
タートルは初期状態で右を向いています。

  1. t.forward(100): 右に100ピクセル進みます。
  2. t.left(90): 左に90度回転します。これにより、タートルは上を向きます。
  3. これを4回繰り返すことで、正方形が描かれます。

例2:ループを使って正多角形を描く

left()は、forループと組み合わせることで、正多角形を簡単に描くことができます。正n角形は、外角が 360 / n 度になります。left()は反時計回りの回転なので、この外角の概念がそのまま使えます。

正三角形を描く

import turtle

screen = turtle.Screen()
t = turtle.Turtle()

# 正三角形 (3つの辺、外角は 360 / 3 = 120度)
for _ in range(3):
    t.forward(100)
    t.left(120)

screen.exitonclick()

正六角形を描く

import turtle

screen = turtle.Screen()
t = turtle.Turtle()

# 正六角形 (6つの辺、外角は 360 / 6 = 60度)
for _ in range(6):
    t.forward(80)
    t.left(60)

screen.exitonclick()

解説
for _ in range(n): n回繰り返し処理を行います。 各繰り返しで、タートルは前進し、その多角形の外角の分だけ左に回転します。これにより、閉じられた多角形が描かれます。

例3:星形を描く

turtle.left()は、星形のような複雑な図形を描く際にも役立ちます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.pencolor("blue")  # ペンの色を青に
t.pensize(2)        # ペンの太さを2に

# 星形 (五芒星)
for _ in range(5):
    t.forward(200)   # 長めの線を進む
    t.left(144)      # 左に144度回転 (360度のうち2回転分の角度)

screen.exitonclick()

解説
五芒星の場合、一筆書きで描く際にはタートルは5回直進し、それぞれ 144 度回転することで図形が完成します。これは 360 / 5 * 2 (5角形の2周分) に相当します。

turtle.left()forward()を組み合わせ、ループ内で進む距離を少しずつ増やしていくことで、渦巻き模様を描くことができます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(0) # 描画速度を最速に設定

for i in range(100):
    t.forward(i * 2)  # 進む距離を徐々に長くする
    t.left(90)        # 左に90度回転

screen.exitonclick()

解説
t.speed(0): タートルの描画速度を最も速く設定します。 for i in range(100): 100回繰り返し処理を行います。 t.forward(i * 2): iが0から99まで増加するにつれて、進む距離が0, 2, 4, ... と増えていきます。 t.left(90): 毎回90度左に回転します。 これにより、正方形が徐々に大きくなっていくような渦巻きが描かれます。



turtle.right() を使う方法

これは最も直接的な代替方法です。turtle.left()が反時計回りに回転するのに対し、turtle.right()は時計回りに回転します。

  • turtle.left(angle) の代替
    • 正の角度
      turtle.right(-angle) とすることで、left(angle) と同じ効果が得られます。例えば、left(90)right(-90) は同じ動きをします。
    • 負の角度
      turtle.right(abs(angle)) とすることで、left(angle) と同じ効果が得られます。例えば、left(-90) (右に90度) と right(90) は同じ動きをします。


import turtle

screen = turtle.Screen()
t = turtle.Turtle()

t.pensize(3) # ペンを太くする

# left() の例
t.pencolor("blue")
t.forward(100)
t.left(90) # 左に90度
t.forward(50)

# right() を使って同じ動きを再現
t.penup() # ペンを上げて移動
t.goto(-100, 0) # 位置を戻す
t.pendown() # ペンを下ろす
t.pencolor("red")
t.forward(100)
t.right(-90) # 右に-90度 = 左に90度
t.forward(50)

screen.exitonclick()

turtle.setheading() または turtle.seth() を使う方法

この方法は、現在のタートルの向きからの相対的な回転ではなく、絶対的な向きを指定したい場合に非常に便利です。turtle.setheading(angle) (またはそのショートカットであるturtle.seth(angle)) は、タートルの向きを北(0度)を基準とした絶対角度に設定します。

  • turtle.left(angle) の代替として
    現在のタートルの向き(t.heading()で取得)に、回転させたい角度を足してsetheading()に渡します。

    t.setheading(t.heading() + angle)

    • 0度: 東(右)
    • 90度: 北(上)
    • 180度: 西(左)
    • 270度 または -90度: 南(下)


import turtle

screen = turtle.Screen()
t = turtle.Turtle()

t.pensize(3)

# left() の例
t.pencolor("blue")
t.forward(100)
t.left(90) # 左に90度
t.forward(50)

# setheading() を使って同じ動きを再現
t.penup()
t.goto(-100, 0)
t.setheading(0) # 初期状態に戻す(東向き)
t.pendown()
t.pencolor("red")
t.forward(100)
t.setheading(t.heading() + 90) # 現在の向きに90度を加算
t.forward(50)

screen.exitonclick()

利点

  • 計算が容易
    角度の足し算引き算で次の向きを決定できます。
  • 絶対的な向きの制御
    特定の方向を向かせたい場合に非常に直感的です。

欠点

  • 相対的な回転を頻繁に行う場合は、毎回t.heading()を呼び出して計算する必要があるため、left()right()の方が簡潔になることがあります。

これらは、left()right()とは少し異なる概念です。tiltangle()はタートルの描画形状自体の傾きを設定し、tilt()はその傾きを相対的に変更します。これらはタートルの移動方向には影響を与えません。主にタートルの表示を視覚的に変えたい場合に使われます。

turtle.left()の直接的な代替とはなりませんが、タートルの表示方向も考慮に入れる場合に役立つかもしれません。


import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.shape("turtle") # タートルの形をタートルにする

t.forward(100)
t.left(90) # 移動方向が変わる
t.forward(50)

t.penup()
t.goto(-100, -50)
t.setheading(0) # 初期方向に戻す
t.pendown()

t.forward(100)
t.tilt(45) # タートル画像自体が45度傾くが、移動方向は変わらない
t.forward(50)

screen.exitonclick()
  • turtle.tilt() / turtle.tiltangle()
    タートルの移動方向ではなく、タートル自身の表示形状の傾きを制御します。
  • turtle.setheading(angle) / turtle.seth(angle)
    絶対的な向きでタートルを制御したい場合に最適です。現在の向きから相対的に回転させることも可能です。
  • turtle.right(angle)
    turtle.left(angle)と逆方向の回転を、正負の角度を反転させることで実現できます。相対的な回転に特化しています。