turtle.left()だけじゃない!Pythonタートルグラフィックスの多様な回転方法
以下に詳しく説明します。
-
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)
- 左に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() # 画面をクリックするまで閉じない
解説
タートルは初期状態で右を向いています。
t.forward(100)
: 右に100ピクセル進みます。t.left(90)
: 左に90度回転します。これにより、タートルは上を向きます。- これを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)
と逆方向の回転を、正負の角度を反転させることで実現できます。相対的な回転に特化しています。