turtle.clearstamps()
この関数は、以下のように説明できます。
turtle.clearstamps()
は、turtle
モジュールで作成されたスタンプ(印影)をすべてクリア(消去)する関数です。
タートルグラフィックスでは、turtle.stamp()
メソッドを使って、現在のタートルの形をキャンバス上に「スタンプ」として残すことができます。これは、タートルが移動するにつれて、その軌跡に印を残したい場合などに便利です。
しかし、これらのスタンプが不要になった場合や、新しい描画を開始する前に古いスタンプをすべて消したい場合に turtle.clearstamps()
を使用します。この関数を呼び出すと、キャンバス上に残されたすべてのスタンプが一度に削除されます。タートル自体の位置や向き、描画状態には影響を与えません。
import turtle
# スクリーンとタートルをセットアップ
screen = turtle.Screen()
my_turtle = turtle.Turtle()
# タートルを移動させながらスタンプを残す
for _ in range(5):
my_turtle.stamp() # 現在の位置にスタンプを残す
my_turtle.forward(50)
my_turtle.right(60)
# 少し待つ (スタンプが残っていることを確認するため)
screen.delay(1000) # 1秒間遅延
# すべてのスタンプをクリア
my_turtle.clearstamps()
# 描画を続ける(スタンプが消えていることを確認)
my_turtle.color("red")
my_turtle.circle(100)
screen.mainloop()
スタンプが消えない/表示されない
よくある原因
-
別のタートルのスタンプを消そうとしている
clearstamps()
は、そのメソッドが呼び出された特定のタートルオブジェクトによって作成されたスタンプのみを消去します。複数のタートルがある場合、それぞれが作成したスタンプは独立しています。- 例
import turtle t1 = turtle.Turtle() t2 = turtle.Turtle() t1.stamp() t2.stamp() t1.clearstamps() # t1が作ったスタンプだけが消える # t2が作ったスタンプを消すには t2.clearstamps() を呼ぶ必要がある
- 例
-
clearstamps() を呼び出すタイミングが早すぎる
time.sleep()
を使って処理を一時停止している場合、clearstamps()
が先に実行されてしまい、スタンプが表示される前に消えてしまうことがあります。turtle
モジュールではtime.sleep()
の代わりにscreen.ontimer()
を使用することが推奨されます。time.sleep()
はturtle
のイベントループをブロックし、描画の更新を妨げることがあります。- 例 (非推奨の time.sleep())
import turtle import time screen = turtle.Screen() my_turtle = turtle.Turtle() my_turtle.stamp() time.sleep(1) # 1秒待つ my_turtle.clearstamps() # 表示される前に消えてしまう可能性がある my_turtle.hideturtle() # タートルを隠す screen.mainloop()
- 推奨される screen.ontimer()
import turtle screen = turtle.Screen() my_turtle = turtle.Turtle() my_turtle.hideturtle() # タートルを隠す # スタンプを作成し、1秒後に消す処理を予約する stamp_id = my_turtle.stamp() def clear_stamps_later(): my_turtle.clearstamps() screen.ontimer(clear_stamps_later, 1000) # 1000ミリ秒 = 1秒後に clear_stamps_later を実行 screen.mainloop()
- 例 (非推奨の time.sleep())
-
そもそもスタンプを作成していない
my_turtle.stamp()
を呼び出していない場合、clearstamps()
で消すものもありません。 -
turtle.update() または turtle.Screen().update() の呼び出し忘れ
turtle.tracer(0)
を使用してアニメーションをオフにしている場合、描画の変更が画面に反映されません。スタンプの作成や削除を行った後、画面を更新するために明示的にturtle.update()
(またはturtle.Screen().update()
)を呼び出す必要があります。- 例
import turtle screen = turtle.Screen() my_turtle = turtle.Turtle() screen.tracer(0) # アニメーションをオフにする my_turtle.stamp() my_turtle.forward(50) my_turtle.stamp() # ここで clearstamps() を呼んでも、tracer(0) のままでは画面に反映されない my_turtle.clearstamps() screen.update() # 画面を更新することで、スタンプが消える
- 例
トラブルシューティング
- どのタートルオブジェクトに対して
stamp()
とclearstamps()
を呼び出しているかを確認してください。 time.sleep()
の代わりにscreen.ontimer()
を検討してください。screen.tracer(0)
を使用している場合は、必ずscreen.update()
を適宜呼び出すようにしてください。
AttributeError: 'module' object has no attribute 'clearstamps'
よくある原因
-
turtle モジュールをオブジェクト指向で使っていない
clearstamps()
は、特定のタートルオブジェクトのメソッドです。turtle.clearstamps()
のようにモジュールから直接呼び出すことはできません。- 誤った例
import turtle turtle.clearstamps() # エラーになる
- 正しい例
import turtle my_turtle = turtle.Turtle() # タートルオブジェクトを作成 my_turtle.clearstamps() # タートルオブジェクトのメソッドとして呼び出す
- 誤った例
トラブルシューティング
turtle.Turtle()
を使ってタートルオブジェクトを作成し、そのオブジェクトに対してclearstamps()
を呼び出すようにしてください。
TypeError: clearstamps() takes at most 1 argument (2 given) など、引数に関するエラー
よくある原因
- 不適切な引数を渡している
clearstamps()
は、引数を全く取らないか、または削除するスタンプの数を指定するための整数を1つだけ取ります。-
clearstamps()
: すべてのスタンプを削除 -
clearstamps(n)
:n
が正の場合: 最初のn
個のスタンプを削除n
が負の場合: 最後のabs(n)
個のスタンプを削除n
がNone
の場合: すべてのスタンプを削除 (デフォルト)
-
誤った例
my_turtle.clearstamps(1, 2) # 引数が多すぎる my_turtle.clearstamps("all") # 型が間違っている
-
トラブルシューティング
- 引数なしで
my_turtle.clearstamps()
を呼び出すか、削除したいスタンプの数を指定する整数を1つだけ渡すようにしてください。
スタンプを個別/特定のIDで削除したい
よくある原因と解決策
-
turtle.clearstamps()
は、スタンプを「すべて」、または「最初からN個」「最後からN個」という形で削除します。特定のスタンプだけをIDで削除したい場合は、turtle.clearstamp(stamp_id)
を使用します。stamp()
メソッドは、作成されたスタンプのIDを返します。- 例
import turtle screen = turtle.Screen() my_turtle = turtle.Turtle() stamp1_id = my_turtle.stamp() my_turtle.forward(50) stamp2_id = my_turtle.stamp() # stamp1_id で指定されたスタンプのみを削除 my_turtle.clearstamp(stamp1_id) screen.mainloop()
- 例
プログラムが終了しない/ウィンドウが閉じない
よくある原因
- screen.mainloop() または turtle.done() を呼び出していない
turtle
グラフィックスは、イベントループで動作します。プログラムが終了しないように、またはウィンドウがすぐに閉じないようにするためには、通常、スクリプトの最後にscreen.mainloop()
またはturtle.done()
を呼び出す必要があります。
トラブルシューティング
- プログラムの最後に
screen.mainloop()
(オブジェクト指向の場合)またはturtle.done()
(手続き型の場合)を追加してください。
例 1: すべてのスタンプを消去する基本的な例
この例では、まずタートルを動かして複数のスタンプを残し、その後 clearstamps()
を呼び出して画面上のすべてのスタンプを一度に消去します。
import turtle
import time # 処理を一時停止するために使用(今回は描画の確認用)
# 1. スクリーンとタートルのセットアップ
screen = turtle.Screen()
screen.setup(width=600, height=400) # ウィンドウサイズを設定
screen.bgcolor("lightblue") # 背景色を設定
screen.title("turtle.clearstamps() の基本例")
my_turtle = turtle.Turtle()
my_turtle.shape("turtle") # タートルの形をカメにする
my_turtle.color("darkgreen") # タートルの色を設定
my_turtle.penup() # 描画しないようにペンを上げる
# 2. スタンプをいくつか作成
my_turtle.goto(-200, 0)
for i in range(5):
my_turtle.stamp() # 現在の位置にスタンプを残す
my_turtle.forward(80)
# 3. スタンプが残っていることを確認するために少し待つ
print("スタンプが作成されました。3秒間待ちます...")
time.sleep(3) # 3秒間プログラムを一時停止
# 4. すべてのスタンプをクリア
print("すべてのスタンプをクリアします...")
my_turtle.clearstamps() # これまでに作成されたすべてのスタンプを消去
# 5. スタンプが消えたことを確認するために、タートルを動かして別の描画をする
my_turtle.goto(0, -100)
my_turtle.pendown() # 描画するためにペンを下ろす
my_turtle.color("red")
my_turtle.circle(50) # 円を描く
# 6. ウィンドウがすぐに閉じないようにする
screen.mainloop()
解説
- 最後に、タートルを動かして円を描くことで、スタンプが本当に消えたことを視覚的に確認できます。
- その後、
my_turtle.clearstamps()
を呼び出すと、そのタートルオブジェクト (my_turtle
) によって作成されたすべてのスタンプが瞬時に画面から消去されます。 time.sleep(3)
で3秒間待つことで、スタンプが画面上に表示されていることを確認できます。- まず、
my_turtle.stamp()
を5回呼び出して、タートルが移動した経路にカメの形の印を残します。
例 2: 特定の数のスタンプを消去する (clearstamps(n)
)
clearstamps()
に引数を渡すことで、削除するスタンプの数を制御できます。
clearstamps(-n)
(n > 0): 最後からn
個のスタンプを削除します。clearstamps(n)
(n > 0): 最初からn
個のスタンプを削除します。
import turtle
import time
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("lightyellow")
screen.title("turtle.clearstamps(n) の例")
my_turtle = turtle.Turtle()
my_turtle.shape("arrow") # 形を矢印にする
my_turtle.color("blue")
my_turtle.penup()
my_turtle.goto(-250, 0)
# 1. たくさんのスタンプを作成し、それぞれのスタンプIDを保持する(今回は不要だが、stamp()はIDを返す)
print("スタンプを10個作成します...")
for _ in range(10):
my_turtle.stamp()
my_turtle.forward(50)
# 2. 作成されたスタンプを確認
print("スタンプが作成されました。2秒間待ちます...")
time.sleep(2)
# 3. 最初から3つのスタンプを消去
print("最初から3つのスタンプをクリアします...")
my_turtle.clearstamps(3) # 最初の3つのスタンプが消える
time.sleep(2)
# 4. 最後から2つのスタンプを消去
print("最後から2つのスタンプをクリアします...")
my_turtle.clearstamps(-2) # 残りのスタンプのうち、最後の2つが消える
time.sleep(2)
# 5. 残りのすべてのスタンプを消去
print("残りのすべてのスタンプをクリアします...")
my_turtle.clearstamps() # 引数なしで、残りのすべてをクリア
time.sleep(1)
my_turtle.hideturtle() # タートルを隠す
screen.mainloop()
解説
- 最後に
my_turtle.clearstamps()
(引数なし) を呼び出すと、残りのすべてのスタンプが消去されます。 - 次に
my_turtle.clearstamps(-2)
を呼び出すと、残りのスタンプ(7個)のうち、最後に作成された2つが消えます。 my_turtle.clearstamps(3)
を呼び出すと、最初に作成された3つのスタンプが消えます。- この例では、まず10個のスタンプを作成します。
例 3: tracer(0)
と update()
との組み合わせ
アニメーションを高速化するために screen.tracer(0)
を使う場合、画面の更新を明示的に行う必要があります。clearstamps()
の効果を画面に反映させるためにも screen.update()
が重要になります。
import turtle
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("lightgreen")
screen.title("tracer() と update() の組み合わせ")
my_turtle = turtle.Turtle()
my_turtle.shape("circle")
my_turtle.color("purple")
my_turtle.penup()
# 1. アニメーションをオフにする (非常に重要)
screen.tracer(0)
# 2. たくさんのスタンプを素早く作成
my_turtle.goto(-250, 0)
for _ in range(20):
my_turtle.stamp()
my_turtle.forward(25)
# 3. ここでスタンプをクリアしても、tracer(0) のため画面には反映されない
my_turtle.clearstamps()
# 4. 画面を更新して変更を反映させる
screen.update() # これで初めてスタンプが画面から消える
# 5. 別の描画を試す
my_turtle.goto(0, -100)
my_turtle.pendown()
my_turtle.color("orange")
my_turtle.circle(80)
# 6. 最終的な状態を更新
screen.update()
screen.mainloop()
screen.update()
を呼び出すことで、それまでのすべての描画変更が一度に画面に表示されます。この例では、スタンプが全く表示されることなく、clearstamps()
が実行され、すぐに消された状態がupdate()
によって描画されます。my_turtle.stamp()
やmy_turtle.clearstamps()
を呼び出しても、screen.update()
を呼び出すまでは画面に何も変化が起きません。screen.tracer(0)
を呼び出すことで、タートルの移動や描画がリアルタイムで表示されなくなります。これにより、非常に多くの描画操作を高速に行うことができます。
turtle.clearstamps()
はタートルのスタンプを消去する非常に便利な方法ですが、turtle
グラフィックスには他の描画消去や制御の方法もいくつかあります。これらは clearstamps()
の直接的な代替というよりは、描画全体をリセットしたり、異なる方法で要素を管理したりするための選択肢として考えられます。
turtle.clearstamp(stamp_id) - 特定のスタンプを消去する
これは clearstamps()
の非常に近い代替であり、むしろよりきめ細かい制御を提供します。stamp()
メソッドはスタンプが作成されると、そのスタンプのIDを返します。このIDを使って、特定のスタンプだけを削除することができます。
用途
特定のスタンプだけを削除したい場合。アニメーションで個々の要素を動的に作成・削除するような場合に有効です。
例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=500, height=300)
screen.title("特定のスタンプを消去 (clearstamp)")
my_turtle = turtle.Turtle()
my_turtle.shape("circle")
my_turtle.color("blue")
my_turtle.penup()
my_turtle.goto(-150, 0)
# スタンプを作成し、そのIDを記録
stamp_ids = []
for i in range(5):
s_id = my_turtle.stamp() # スタンプIDを取得
stamp_ids.append(s_id)
my_turtle.forward(70)
print("スタンプが作成されました。3秒間待ちます...")
time.sleep(3)
# 2番目に作成されたスタンプ(インデックス1)を消去
if len(stamp_ids) > 1:
print(f"2番目のスタンプ (ID: {stamp_ids[1]}) を消去します...")
my_turtle.clearstamp(stamp_ids[1])
time.sleep(2)
# 最後のスタンプを消去
if len(stamp_ids) > 0:
print(f"最後のスタンプ (ID: {stamp_ids[-1]}) を消去します...")
my_turtle.clearstamp(stamp_ids[-1])
my_turtle.hideturtle()
screen.mainloop()
解説
my_turtle.clearstamp(stamp_ids[1])
のように、特定のIDを指定してスタンプを削除します。my_turtle.stamp()
が返すIDをリストstamp_ids
に保存します。
turtle.clear() - タートルの描画をすべて消去する
このメソッドは、そのタートル自身がこれまでに描いたすべての線や図形を消去します。スタンプは消えませんし、他のタートルの描画にも影響しません。タートルの位置や向きはリセットされません。
用途
特定のタートルの描画履歴をきれいにしたいが、スタンプや他のタートルの状態は維持したい場合。
例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=500, height=300)
screen.title("turtle.clear() の例")
my_turtle = turtle.Turtle()
my_turtle.shape("turtle")
my_turtle.color("green")
my_turtle.pensize(3)
my_turtle.speed(1) # 遅めに設定
# 1. 描画を行う
my_turtle.forward(100)
my_turtle.left(90)
my_turtle.forward(100)
my_turtle.stamp() # スタンプも残しておく
# 2. 描画されたことを確認
print("描画とスタンプが作成されました。3秒間待ちます...")
time.sleep(3)
# 3. 描画(線)をクリアする(スタンプは消えない)
print("タートルの描画をクリアします (スタンプはそのまま)...")
my_turtle.clear() # 描いた線は消えるが、スタンプは残る
time.sleep(2)
# 4. スタンプもクリア
print("残ったスタンプをクリアします...")
my_turtle.clearstamps()
my_turtle.hideturtle()
screen.mainloop()
解説
my_turtle.clear()
を呼び出すと、描かれた線は消えますが、スタンプはそのまま残ります。これはclear()
がスタンプを対象としないためです。my_turtle.forward()
などで線を描き、my_turtle.stamp()
でスタンプを残します。
turtle.reset() - タートルの状態を完全にリセットする
reset()
は、そのタートル自身が行った描画をすべて消去し、タートルの位置、向き、色、ペンの状態などを初期状態にリセットします。これもスタンプには影響しません。
用途
特定のタートルを「新品」の状態に戻したい場合。
例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=500, height=300)
screen.title("turtle.reset() の例")
my_turtle = turtle.Turtle()
my_turtle.shape("square")
my_turtle.color("purple")
my_turtle.pensize(5)
my_turtle.goto(-100, 50)
# 1. 描画とスタンプを行う
my_turtle.pendown()
my_turtle.circle(50)
my_turtle.penup()
my_turtle.goto(100, 50)
my_turtle.stamp() # スタンプも残しておく
my_turtle.color("pink") # 色も変更
print("描画とスタンプが作成され、タートルの状態も変更されました。3秒間待ちます...")
time.sleep(3)
# 2. タートルをリセットする(描画は消えるがスタンプは残る)
print("タートルをリセットします (描画は消えるがスタンプはそのまま)...")
my_turtle.reset() # 描画は消え、タートルは中央に戻り、初期状態になる
time.sleep(2)
# 3. スタンプをクリア
print("残ったスタンプをクリアします...")
my_turtle.clearstamps()
my_turtle.hideturtle()
screen.mainloop()
解説
my_turtle.reset()
を呼び出すと、円の描画が消え、タートルは画面中央(homeポジション)に戻り、色やペンの状態も初期値に戻ります。しかし、スタンプは消えません。
turtle.Screen().clearscreen() または turtle.clearscreen() - スクリーン全体を消去する
これは Screen
オブジェクトのメソッドで、画面上のすべての描画(すべてのタートルの描画、すべてのスタンプを含む)を完全に消去します。すべてのタートルは中央(homeポジション)にリセットされます。
用途
画面全体を完全にリフレッシュして、まっさらな状態から描画を始めたい場合。
例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("white")
screen.title("screen.clearscreen() の例")
# 複数のタートルと描画
t1 = turtle.Turtle()
t1.shape("turtle")
t1.color("green")
t1.penup()
t1.goto(-150, 50)
t1.stamp()
t1.pendown()
t1.forward(100)
t2 = turtle.Turtle()
t2.shape("arrow")
t2.color("blue")
t2.penup()
t2.goto(100, -50)
t2.stamp()
t2.pendown()
t2.circle(30)
print("複数のタートルが描画とスタンプを作成しました。3秒間待ちます...")
time.sleep(3)
# 画面上のすべてをクリア
print("画面上のすべてをクリアします...")
screen.clearscreen() # すべてのタートル、すべての描画、すべてのスタンプが消える
# 画面がクリアされた後、新しい描画を開始
new_turtle = turtle.Turtle()
new_turtle.color("red")
new_turtle.write("画面がクリアされました!", align="center", font=("Arial", 20, "normal"))
screen.mainloop()
screen.clearscreen()
を呼び出すと、t1
とt2
の両方が描いた線とスタンプがすべて消去され、タートルも初期状態(中央、初期向き、初期色など)に戻ります。これは最も強力なリセット方法です。
メソッド | 対象 | 消去されるもの | リセットされるもの |
---|---|---|---|
turtle.clearstamps() | そのタートルが作成したスタンプ | そのタートルが作成したすべてのスタンプ | なし |
turtle.clearstamp(id) | 特定のIDのスタンプ | そのIDのスタンプ | なし |
turtle.clear() | そのタートルが描いた線 | そのタートルが描いた線 | なし(位置、向き、色などはそのまま) |
turtle.reset() | そのタートルが描いた線と状態 | そのタートルが描いた線 | そのタートルの位置、向き、色、ペンの状態などすべて |
turtle.Screen().clearscreen() | スクリーン上のすべての描画とタートル | 画面上のすべての描画とスタンプ | すべてのタートルの位置、向き、色などすべて |