図形描画をマスター!Python turtle.lt() を使った実践コード例
この関数の一般的な構文は以下の通りです。
turtle.lt(angle)
または、タートルオブジェクトが作成されている場合は、
t.lt(angle)
ここで、angle
はタートルを回転させる度数を指定する数値です。例えば、turtle.lt(90)
と記述すると、タートルは左に90度回転します。
具体的な例
import turtle
# スクリーンとタートルを設定
screen = turtle.Screen()
t = turtle.Turtle()
# 前に進む
t.forward(100)
# 左に90度回転
t.lt(90)
# 再び前に進む
t.forward(100)
# 左に45度回転
t.lt(45)
# もう一度前に進む
t.forward(100)
# 描画を終了
screen.mainloop()
このコードを実行すると、タートルは最初に右に100ピクセル進み、次に左に90度向きを変えてから100ピクセル進み、さらに左に45度向きを変えてから100ピクセル進む様子が描画されます。
AttributeError: 'module' object has no attribute 'lt'
- トラブルシューティング
-
import turtle
の後に、必ずタートルオブジェクトを作成してください。import turtle t = turtle.Turtle() # これがタートルオブジェクトの作成 t.lt(90) # 作成したタートルオブジェクトのメソッドを呼び出す
-
もし
from turtle import *
を使っている場合(あまり推奨されませんが)、タートルオブジェクトを作成せずにlt(90)
と書くことも可能ですが、通常は上記のturtle.Turtle()
を使うのが良い習慣です。
-
- エラーの原因
turtle
モジュールを正しくインポートしていないか、タートルオブジェクトを作成せずに直接turtle.lt()
を呼び出そうとしている場合に発生します。 例えば、import turtle
とした後、turtle.lt(90)
と書いてしまうとこのエラーが出ます。lt()
はタートルオブジェクトのメソッドだからです。
TypeError: lt() missing 1 required positional argument: 'angle'
- トラブルシューティング
-
lt()
の括弧内に、回転させたい角度を数値で指定してください。t.lt(90) # 90度左に回転 t.lt(45) # 45度左に回転
-
- エラーの原因
turtle.lt()
関数に、回転させる角度(angle
)を指定していない場合に発生します。lt()
は引数を一つ必要とします。
TypeError: 'float' object is not callable または TypeError: 'int' object is not callable
- トラブルシューティング
-
lt
の後には必ず括弧()
をつけて、引数(角度)を渡してください。t.lt(90) # 正しい # t.lt 90 # 間違い(SyntaxErrorになる可能性もありますが、状況によって上記TypeError)
-
- エラーの原因
これはturtle.lt
を呼び出す際に、括弧()
を忘れている場合に発生することがあります。Pythonはt.lt
を単なる属性(数値や文字列など)として解釈し、それを関数として呼び出そうとするため、このようなエラーが出ます。
SyntaxError: invalid syntax
- トラブルシューティング
- エラーメッセージが指し示す行とその周辺を注意深く確認し、括弧が閉じているか、余分な記号がないか、インデントが正しいかを確認してください。
- エラーの原因
これは一般的なPythonの構文エラーで、turtle.lt()
自体に直接関係することは少ないですが、関数呼び出しの際に括弧の閉じ忘れ、不正な文字の混入、インデントの間違いなどで発生します。
タートルが動かない/表示されない
- トラブルシューティング
-
タートルとスクリーンの初期設定を確認
import turtle screen = turtle.Screen() # スクリーンオブジェクトの作成 t = turtle.Turtle() # タートルオブジェクトの作成 # ここに描画コード t.forward(50) t.lt(90) t.forward(50) screen.mainloop() # または turtle.done() を最後に呼び出してウィンドウを維持する
-
描画速度の調整
タートルの動きが速すぎる場合は、turtle.speed()
を使って速度を落とすことができます。0が最速、1が最も遅く、10が速いです。t.speed(1) # 最も遅い速度 # または t.speed(3) # デフォルトに近い速度
-
- エラーの原因
コードにエラーはないものの、期待通りにタートルが動かない、あるいは画面に表示されない場合があります。これはturtle.lt()
の問題というよりは、プログラム全体の流れの問題であることが多いです。- タートルオブジェクトを作成していない。
turtle.Screen()
を設定していない、またはscreen.mainloop()
やturtle.done()
を呼び出していないため、ウィンドウがすぐに閉じてしまう。- タートルの描画速度が速すぎて、動きが見えない。
論理エラー(意図しない動き)
- トラブルシューティング
- 描きたい図形に対して、タートルの各ステップでどの方向に何度回転すべきかを紙に書き出すなどして、論理を再確認してください。
lt()
(左回転)とrt()
(右回転)を混同していないか確認してください。
- エラーの原因
turtle.lt()
自体は正しく機能しているものの、意図した図形や動きにならない場合。これは、lt()
に渡す角度が間違っている、または回転方向をlt()
(左回転)ではなくrt()
(右回転)と間違えているなどが考えられます。
基本的な左回転と直線
これはturtle.lt()
の最も基本的な使い方です。
import turtle
# 1. スクリーンとタートルオブジェクトの準備
screen = turtle.Screen() # 描画するキャンバス(スクリーン)を作成
t = turtle.Turtle() # タートル(描画するペン)を作成
# 2. 描画の開始
t.forward(100) # 100ピクセル前進
# 3. 左に90度回転
t.lt(90) # 左に90度向きを変える(上を向く)
# 4. 再び前進
t.forward(100) # 100ピクセル前進(上に進む)
# 5. 左に90度回転
t.lt(90) # 左に90度向きを変える(左を向く)
# 6. 再び前進
t.forward(100) # 100ピクセル前進(左に進む)
# 7. 描画終了までウィンドウを維持
screen.mainloop() # ウィンドウがすぐに閉じないようにする
解説
t.lt(90)
: タートルを現在の位置で左(反時計回り)に90度回転させます。これにより、次にforward()
が呼ばれたときに、タートルは新しい向きに進みます。この例では、最初右を向いていたタートルが上を向き、次に左を向くようになります。t.forward(100)
: タートルの現在の向きに沿って100ピクセル進みます。screen = turtle.Screen()
とt = turtle.Turtle()
: 描画するための画面とタートルオブジェクトを作成します。import turtle
: タートルグラフィックスモジュールを読み込みます。
正方形を描く
turtle.lt()
を使って正方形を描く最も一般的な方法です。
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
# 描画速度を少し速くする (オプション)
t.speed(5)
# 正方形の各辺を描くループ
for _ in range(4): # 4回繰り返す
t.forward(100) # 辺の長さ
t.lt(90) # 次の辺のために左に90度回転
screen.mainloop()
解説
- ループ内で、タートルは100ピクセル前進し、その後左に90度回転します。これを4回繰り返すことで、4つの辺と4つの直角を持つ正方形が描画されます。
for _ in range(4):
: 4回繰り返すループです。_
はループ変数を使わないことを示します。
星型(例: 五芒星)を描く
角度の計算が少し複雑になりますが、lt()
の柔軟性を示す良い例です。五芒星の場合、外角は180 - (180/5) * 2 = 36度ですが、タートルは常に「辺」の向きに対して回転するので、内角を考慮する必要があります。
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
# 描画速度を速くする
t.speed(0) # 0は最速
# 五芒星を描く
for _ in range(5): # 5つの「角」を描く
t.forward(150) # 辺の長さ
# 五芒星の頂点での外角は180 - (180/5)*2 = 36度に見えますが、
# タートルが星の線に沿って進む場合、回転角度は360 / 5 * 2 = 144度になります。
t.lt(144) # 左に144度回転
screen.mainloop()
解説
- 五芒星は、各頂点でタートルを144度回転させることで描くことができます。これは、星の内部の交差する線によってできる角度とは異なり、タートルが実際に線に沿って移動し、次の線に向かうために回転する角度です。
スパイラル(螺旋)を描く
lt()
とforward()
を組み合わせて、徐々に長くなる線と一定の回転角度で螺旋を描きます。
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(0) # 最速
length = 5 # 最初の線の長さ
# スパイラルを描くループ
for _ in range(50): # 50回繰り返す
t.forward(length) # 現在の長さだけ前進
t.lt(10) # 左に10度回転
length += 2 # 次の線の長さを2ピクセル長くする
screen.mainloop()
解説
t.lt(10)
で常に10度回転することで、徐々に大きな円を描くような螺旋が形成されます。length
変数を初期化し、ループごとにその値を増やしていきます。
図形を塗りつぶす
begin_fill()
とend_fill()
を使って、描画した図形を塗りつぶすことができます。
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
t.color("red", "yellow") # ペンの色を赤、塗りつぶしの色を黄色に設定
t.begin_fill() # 塗りつぶしを開始
# 正方形を描く
for _ in range(4):
t.forward(100)
t.lt(90)
t.end_fill() # 塗りつぶしを終了
screen.mainloop()
t.end_fill()
:begin_fill()
からend_fill()
までの描画によって作られた閉じた領域が、設定された色で塗りつぶされます。t.begin_fill()
: これ以降の描画が塗りつぶしの対象になります。t.color("red", "yellow")
: ペンの色をred
(赤)、塗りつぶしの色をyellow
(黄色)に設定します。
turtle.right() または turtle.rt() を使う
最も直接的な代替方法は、タートルを時計回り(右)に回転させる turtle.right()
またはその省略形 turtle.rt()
を使用することです。
-
例
左に90度回転する代わりに、右に270度回転させる。import turtle screen = turtle.Screen() t = turtle.Turtle() t.forward(100) # t.lt(90) の代替 t.rt(270) # 右に270度回転することは、左に90度回転することと同じ t.forward(100) screen.mainloop()
解説
非常に単純な例ではありますが、lt()
とrt()
は互いに逆の方向の回転を行うため、角度を調整することで代替として機能します。 -
考え方
左にX度回転する代わりに、右に(360 - X)
度回転させます。あるいは、単純に方向を逆にする場合は右回転を使います。
turtle.setheading() または turtle.seth() を使う
turtle.setheading()
またはその省略形 turtle.seth()
は、タートルの向きを絶対的な角度で設定する関数です。これは、現在の向きからの相対的な回転ではなく、常に東を0度、北を90度、西を180度、南を270度とする絶対座標系に基づいています。
-
例
左に90度回転する代わりに、現在の向きから90度増えた絶対角度に設定する。import turtle screen = turtle.Screen() t = turtle.Turtle() t.forward(100) # 現在のタートルの向きを取得 current_heading = t.heading() # 新しい向きを計算: 現在の向き + 90度(左回転) new_heading = current_heading + 90 # 新しい向きを設定 # t.lt(90) の代替 t.setheading(new_heading) t.forward(100) # 別のアプローチ: 特定の絶対角度に設定する例 # タートルを北(90度)に向ける t.setheading(90) t.forward(50) screen.mainloop()
解説
t.heading()
は現在のタートルの向き(絶対角度)を返します。t.setheading(angle)
はタートルの向きをangle
度に直接設定します。lt()
やrt()
のように相対的に回転させるのではなく、絶対的な向きを指定します。
-
考え方
特定の方向にタートルを向けたい場合に非常に便利です。現在の向きが何であっても、指定した角度に強制的に変更します。
数学的な計算と turtle.setheading() の組み合わせ
より複雑なアルゴリズムで、タートルの回転角度を計算する必要がある場合に、setheading()
を数学的な計算と組み合わせて使用します。これは、特に複雑なパターンやフラクタル図形を描く際に役立ちます。
-
例
多角形を描くが、角度計算を明示的に行う場合。import turtle import math # 数学関数を使う場合(この例では不要だが一般的に使われる) screen = turtle.Screen() t = turtle.Turtle() t.speed(0) num_sides = 6 # 六角形 side_length = 80 angle_to_turn = 360 / num_sides # 各角で曲がるべき角度 for _ in range(num_sides): t.forward(side_length) # t.lt(angle_to_turn) の代替として、setheadingを使う場合 # 現在の向きにangle_to_turnを加算して設定 t.setheading(t.heading() + angle_to_turn) screen.mainloop()
解説
この例では、lt()
とまったく同じ結果を得るためにsetheading()
を使っています。t.heading() + angle_to_turn
は、現在の向きからangle_to_turn
だけ左に回転するのと同じ効果があります。このアプローチは、プログラムがより複雑な角度計算を必要とする場合に、デバッグや理解がしやすくなることがあります。
turtle.home() や turtle.towards() などで位置と向きをリセット/指定する
直接的な回転とは異なりますが、タートルの向きをリセットしたり、特定の点に向かせたりすることで、結果的に向きを変更します。
turtle.towards(x, y)
: 指定された座標(x, y)
に向かうために必要な角度を計算して返します。これを使ってsetheading()
で向きを設定できます。turtle.home()
: タートルを初期位置(0,0)に戻し、向きを東(0度)にリセットします。
これらはlt()
の直接的な代替ではありませんが、描画のロジックによっては、相対的な回転よりも絶対的な位置や向きの制御の方が適している場合があります。
関数名 | 種類 | 説明 | lt() との関係 |
---|---|---|---|
turtle.rt(angle) | 相対回転 | タートルを時計回り(右)にangle 度回転させる。 | 左回転の逆(角度調整で代替可能) |
turtle.right(angle) | 相対回転 | turtle.rt() と同じ。 | turtle.rt() と同じ |
turtle.setheading(angle) | 絶対回転 | タートルの向きをangle 度(絶対角度、東が0度)に設定する。 | 現在の向きと組み合わせて代替可能 |
turtle.seth(angle) | 絶対回転 | turtle.setheading() と同じ。 | turtle.setheading() と同じ |
turtle.home() | 位置/向きリセット | タートルを原点に戻し、向きを東(0度)にリセットする。 | 特定の場合のリセットとして代替可能 |
turtle.towards(x, y) | 角度計算 | 指定座標に向かうために必要な角度を計算。setheading() と組み合わせて使う。 | 間接的な向きの変更手段 |