Python Turtle: clearscreen()徹底解説 - 画面クリアとタートルリセットの完全ガイド
turtle.clearscreen()
は、Pythonのタートルグラフィックスモジュール(turtle
)で使用される関数です。この関数は、現在開いているタートルグラフィックスのウィンドウ全体をクリアし、すべてのタートルを初期状態に戻します。
具体的にどのような動作をするかというと:
- 描画のクリア
画面上のすべての線や図形が消去され、まっさらな状態になります。 - タートルのリセット
- すべてのタートル(カメ)が画面中央の原点(座標(0,0))に移動します。
- すべてのタートルが東(右方向、0度)を向きます。
- タートルの描画ペンが下りた状態(描画が可能な状態)になります。
- ペンの色、太さ、形状などの設定もデフォルトの状態に戻ります。
turtle.clearscreen()
と似た関数との違い
turtle
モジュールには、画面をクリアする似たような関数がいくつかありますが、それぞれ動作が異なります。
-
turtle.reset()
- 対象
特定のタートル。 - 効果
そのタートルが描いたものを消し、**そのタートルの位置、向き、ペンの設定などを初期状態にリセットします。**ただし、他のタートルや画面全体には影響しません。 - (例:
my_turtle.reset()
のように、特定のタートルインスタンスに対して呼び出します。)
- 対象
-
turtle.clear()
- 対象
特定のタートルが描いた線や図形のみ。 - 効果
そのタートルが描いたものだけを消し、タートルの位置や向きはそのままです。他のタートルやそれらが描いたものには影響しません。 - (例:
my_turtle.clear()
のように、特定のタートルインスタンスに対して呼び出します。)
- 対象
-
- 対象
画面全体とすべてのタートル。 - 効果
画面クリア、すべてのタートルを初期状態にリセット。 - エイリアス
turtles.clearscreen()
(turtles
モジュール全体を指す場合もありますが、通常はturtle
モジュールの一部として使われます)
- 対象
一般的に、新しい描画を開始する前や、プログラムをリセットして最初からやり直したい場合などにturtle.clearscreen()
が使われます。
import turtle
# タートルを生成
t = turtle.Turtle()
# 何か描画する
t.forward(100)
t.left(90)
t.forward(100)
# 少し待つ
turtle.time.sleep(2)
# 画面全体をクリアし、タートルを初期状態に戻す
turtle.clearscreen()
# クリアされた画面で新しい描画を開始
t = turtle.Turtle() # clearscreen()によって既存のタートルがリセットされるため、通常は再度タートルインスタンスを取得するか、新しく生成します。
t.circle(50)
# 画面を閉じる
turtle.done()
AttributeError: 'module' object has no attribute 'clearscreen'
考えられる原因
turtle.clearscreen()
を呼び出す際に、turtle
モジュールが正しくインポートされていないか、あるいは別の名前でインポートされているのにその名前を使っていない場合です。
よくある間違い
import my_turtle as turtle
のように、turtle
とは異なるエイリアスでインポートしているのに、turtle.clearscreen()
と呼び出す。from turtle import Turtle
のように、特定のクラスのみをインポートした場合に、turtle.clearscreen()
と呼び出す。この場合、clearscreen()
はturtle
モジュール全体に属する関数であるため、直接アクセスできません。
トラブルシューティング
- 特定のタートルインスタンスのclear()やreset()と混同していないか確認する
clearscreen()
はモジュールレベルの関数であり、特定のタートルインスタンス(例:my_turtle = turtle.Turtle()
)に対して呼び出すものではありません。タートルインスタンスをクリアしたい場合は、my_turtle.clear()
やmy_turtle.reset()
を使用します。 - import turtle を使用しているか確認する
import turtle # ... turtle.clearscreen() # 正しい
clearscreen()を呼び出したのに画面がクリアされない、またはタートルがリセットされない
考えられる原因
clearscreen()
の動作について誤解しているか、コードの実行フローに問題がある場合があります。
よくある間違い
- turtle.done()やturtle.mainloop()がclearscreen()の前に来ている
turtle.done()
やturtle.mainloop()
が呼び出されると、通常はイベントループに入り、プログラムがユーザーの操作を待つ状態になります。この後にclearscreen()
を呼び出しても、すでに描画ウィンドウが閉じてしまっていたり、更新されない状態になっている場合があります。clearscreen()
は描画処理の途中で呼び出すのが適切です。 - 描画後にclearscreen()が実行されていない
clearscreen()
の呼び出しが、描画処理よりも前に来てしまっている、または条件分岐などでスキップされている可能性があります。コードの実行順序を確認してください。 - 複数のウィンドウがある場合
もし複数のタートルグラフィックスウィンドウを同時に開いている場合、turtle.clearscreen()
は通常、最後にアクティブになったウィンドウに対して動作します。意図したウィンドウがクリアされない場合は、どのウィンドウが現在アクティブになっているかを確認する必要があるかもしれません。(ただし、通常は単一のウィンドウで作業することが多いです。) - turtle.clear()と混同している
turtle.clear()
は特定のタートルが描いた線のみを消去し、タートルの位置や向きは変えません。画面全体をクリアし、すべてのタートルをリセットするにはturtle.clearscreen()
が必要です。
トラブルシューティング
- turtle.done()の位置
turtle.done()
はプログラムの最後に置くのが一般的です。 - コードの実行フローの確認
clearscreen()
が期待するタイミングで実行されているか、デバッグツールやprint()
文で確認します。 - 関数名の確認
turtle.clearscreen()
を正しく使用しているか確認します。
clearscreen()後にタートルが見えなくなる、または操作できなくなる
考えられる原因
clearscreen()
はすべてのタートルをリセットするため、それまでに作成したタートルインスタンスが無効になったり、初期位置に戻って見えにくくなったりすることがあります。
よくある間違い
clearscreen()
を実行した後、古いタートルインスタンスを使い続けようとしている。clearscreen()
は内部的に新しいタートルインスタンスを作成し直すような効果があります。
トラブルシューティング
-
タートルの初期位置を確認する
clearscreen()
の後は、すべてのタートルが画面中央の原点(0,0)に、東を向いた状態でリセットされます。画面の他の部分に描画したい場合は、goto()
などの関数でタートルを移動させる必要があります。 -
clearscreen()の後に新しいタートルインスタンスを作成する(または既存のものを再取得する)
clearscreen()
を呼び出した後、通常は再度turtle.Turtle()
を呼び出して新しいタートルインスタンスを取得するか、既存の変数に再割り当てするのが安全です。import turtle # 最初の描画 t1 = turtle.Turtle() t1.forward(100) turtle.time.sleep(1) # 少し待つ # 画面クリア&リセット turtle.clearscreen() # 新しいタートルインスタンスを(必要であれば)作成し、使用する # clearscreen()は既存のタートルもリセットするので、 # 実際には新しいタートルオブジェクトを生成する必要があることが多い # 例: t1がまだ有効かどうかは保証されない # 確実なのは新しくタートルを作るか、turtle.Turtle()を再度呼び出すこと t2 = turtle.Turtle() # 新しいタートルを作成 t2.circle(50) turtle.done()
上記のように、
clearscreen()
後は、たとえ同じ変数名であっても、もう一度turtle.Turtle()
を呼び出して新しいタートルオブジェクトを扱う方が安全です。
考えられる原因
アニメーションを伴う描画で頻繁にclearscreen()
を呼び出すと、描画が消去され、再描画されるたびに画面がちらつくことがあります。
トラブルシューティング
turtle.clearscreen()
は、Pythonのタートルグラフィックスで画面全体をクリアし、すべてのタートルを初期状態に戻す関数です。いくつかの使用例を見ていきましょう。
例1: 基本的な使用法 - 描画のクリアとリセット
この例では、まず何か図形を描画し、少し待ってからclearscreen()
を呼び出して画面を完全にクリアします。
import turtle
import time
# 画面とタートルを準備
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1) # タートルの速度を設定(ゆっくり動くように)
print("最初の描画を開始します...")
# 最初の描画:正方形
t.pensize(3) # ペンの太さ
t.pencolor("blue") # ペンの色
for _ in range(4):
t.forward(100)
t.right(90)
time.sleep(2) # 2秒待つ
print("clearscreen() を呼び出して画面をクリアし、タートルをリセットします。")
# 画面全体をクリアし、すべてのタートルを初期状態に戻す
# clearscreen()の後、既存のタートルオブジェクトtはリセットされます。
# したがって、新しい描画のためにtを再度初期化するか、新しいタートルを作成するのが一般的です。
turtle.clearscreen()
# clearscreen()が実行された後、tの描画設定は初期値に戻っています。
# ここでtを使おうとすると、以前の描画は消えていますが、t自体は存在し、
# 画面中央(0,0)に、東向き(0度)でペンダウンの状態になっています。
print("新しい描画を開始します(タートルは中央にリセットされています)。")
# 2回目の描画:円
# t.pencolor("red") # 色などを再設定する必要がある
# t.circle(50)
# 上記のように既存のtを使ってもいいですが、
# clearscreen()は「すべてのタートル」をリセットするため、
# 新しいタートルオブジェクトを扱うのがより明確で安全です。
new_t = turtle.Turtle()
new_t.speed(1)
new_t.pencolor("red")
new_t.circle(50) # 半径50の円を描く
time.sleep(2) # 2秒待つ
turtle.done() # 描画ウィンドウを閉じないようにする
print("プログラム終了。")
説明
- その後、新しいタートル
new_t
を作成し、赤い円を描画しています。clearscreen()
の後に既存のタートルを使用することもできますが、そのタートルも初期状態にリセットされている点に注意が必要です。 turtle.clearscreen()
が呼び出されると、正方形が消え、t
(または他のすべてのタートル)は画面中央に戻り、東を向き、ペンの設定も初期状態に戻ります。time.sleep(2)
で2秒間描画結果を見せます。- 最初に青い正方形を描画します。
例2: アニメーションにおける clearscreen()
の注意点と tracer()
/update()
による改善
頻繁にclearscreen()
を呼び出すと、画面がちらつく(点滅する)ことがあります。これは、描画がクリアされ、再描画される過程が目に見えるためです。これを避けるためには、turtle.tracer(0)
とturtle.update()
を組み合わせるのが一般的です。
import turtle
import time
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(0) # 最速に設定(アニメーション向け)
t.hideturtle() # タートル(矢印)を非表示にする
print("ちらつきのある描画(clearscreen()を頻繁に呼び出す場合)")
# 頻繁な clearscreen() でちらつきが発生する例
for i in range(10):
t.clear() # 特定のタートルが描いたものをクリア(ここでは画面クリアに近い効果)
# clearscreen() でも同じようにちらつく
# turtle.clearscreen() # これでもちらつく
t.penup() # ペンを上げる
t.goto(0, i * 10 - 50) # 少しずつ下に移動
t.pendown() # ペンを下げる
t.circle(20) # 円を描く
screen.update() # ここで更新すると、クリア→描画→更新の繰り返しでちらつく
time.sleep(0.2) # 少し待つ
time.sleep(1)
turtle.clearscreen() # 一旦画面をリセット
print("tracer() と update() を使ってちらつきをなくす例")
# tracer(0) を使って自動更新を無効にする
screen.tracer(0)
# t は clearscreen() でリセットされているので、再度設定
t.showturtle() # タートルを再表示
t.pencolor("green")
for i in range(10):
t.clear() # 前の円をクリア
t.penup()
t.goto(0, i * 10 - 50)
t.pendown()
t.circle(20)
# ここでは update() を呼び出さないので、描画はすぐに表示されない
screen.update() # すべての描画が完了したら、一度だけ画面を更新
print("ちらつきなく描画が完了しました。")
time.sleep(2)
turtle.done()
説明
- ちらつきのない例
screen.tracer(0)
を呼び出すことで、タートルグラフィックスの自動更新を無効にしています。これにより、ループ内でt.clear()
やt.circle()
を呼び出しても、画面にはすぐに反映されません。すべての描画操作が完了した後、screen.update()
を一度だけ呼び出すことで、最終的な状態がスムーズに表示され、ちらつきが解消されます。 - ちらつきの例
最初のループでは、t.clear()
(またはturtle.clearscreen()
)とscreen.update()
をループ内で頻繁に呼び出しています。これにより、円が描かれるたびに画面がクリアされ、再描画されるため、ちらつきが発生します。
clearscreen()
は「すべてのタートル」をリセットするため、複数のタートルが存在する場合にどのように動作するかを見てみましょう。
import turtle
import time
screen = turtle.Screen()
# 2つのタートルを作成
t1 = turtle.Turtle()
t1.pencolor("blue")
t1.penup()
t1.goto(-100, 0)
t1.pendown()
t2 = turtle.Turtle()
t2.pencolor("red")
t2.penup()
t2.goto(100, 0)
t2.pendown()
print("2つのタートルが描画を開始します。")
# t1 で正方形を描く
for _ in range(4):
t1.forward(50)
t1.right(90)
# t2 で三角形を描く
for _ in range(3):
t2.forward(50)
t2.left(120)
time.sleep(2) # 2秒待つ
print("turtle.clearscreen() を呼び出します。")
# 画面全体をクリアし、すべてのタートル(t1, t2)をリセット
turtle.clearscreen()
# clearscreen() の後、t1 と t2 はどちらも画面中央(0,0)に、東を向いた状態でリセットされています。
# また、ペンの色や太さも初期状態に戻っています。
print("すべてのタートルがリセットされ、中央に移動しました。")
# t1, t2 のどちらを使っても、画面中央から描画が開始される
t1.pencolor("purple")
t1.pensize(2)
t1.forward(80)
# t2 も同じく中央にいる
t2.pencolor("orange")
t2.pensize(5)
t2.backward(80)
time.sleep(2)
turtle.done()
- その後、それぞれのタートルを使って描画を続けると、どちらも画面中央から開始されることが確認できます。
- さらに重要なのは、
t1
もt2
もどちらも画面中央の原点(0,0)に、東を向いた状態でリセットされることです。 turtle.clearscreen()
が呼び出されると、画面上の両方の図形が消去されます。- 最初に、画面の異なる位置から2つのタートル(青い
t1
と赤いt2
)がそれぞれ異なる図形を描きます。
主な代替方法は以下の通りです。
-
- 説明
これは、ある特定のタートル(カメ)が描いた線や図形だけを画面から消去します。タートルの位置、向き、ペンの設定などはそのまま維持されます。他のタートルや、そのタートル以外のものが描いたものには影響しません。 - いつ使うか
特定のオブジェクトの描画だけを更新・削除したい場合、またはタートルの位置や向きを変えずに以前の軌跡だけを消したい場合に適しています。 - 例
import turtle import time t = turtle.Turtle() t.pensize(3) t.pencolor("blue") t.forward(100) t.left(90) t.forward(100) time.sleep(1) print("t.clear() を呼び出します。タートルの位置と向きは変わりません。") t.clear() # t が描いたものだけが消える time.sleep(1) t.pencolor("green") # t の色は変わったが、位置は変わっていない t.forward(50) # 前の描画の続きから始まる t.circle(30) time.sleep(1) turtle.done()
- 説明
-
特定のタートルインスタンスをリセットする (turtle.reset())
- 説明
これは、特定のタートルが描いたものを消去するだけでなく、そのタートルの位置、向き、ペンの色、太さ、形状などの設定をすべて初期状態に戻します。しかし、他のタートルや画面全体には影響しません。 - いつ使うか
ある特定のタートルだけを「新品」の状態に戻したい場合に適しています。 - 例
import turtle import time t1 = turtle.Turtle() t1.pencolor("blue") t1.pensize(3) t1.circle(50) t1.penup() t1.goto(100, 0) # t1 を移動 t1.pendown() t2 = turtle.Turtle() t2.pencolor("red") t2.square(60) # t2 で正方形を描く time.sleep(1) print("t1.reset() を呼び出します。t2 とその描画には影響しません。") t1.reset() # t1 の描画が消え、t1 は中央にリセットされる time.sleep(1) # t1 は中央にリセットされている t1.pencolor("purple") # 色もリセットされているので再設定 t1.forward(80) # t2 とその描画はそのまま残っている t2.pencolor("orange") # t2 の色はそのまま t2.backward(50) time.sleep(1) turtle.done()
- 説明
-
画面の自動更新を無効にし、手動で更新する (screen.tracer() と screen.update())
- 説明
これは画面を「クリア」するわけではありませんが、多くの場合clearscreen()
やclear()
が使われるアニメーションのちらつきを避けるための最も推奨される方法です。screen.tracer(0)
を呼び出すと、タートルによる描画がすぐに画面に反映されなくなります。すべての描画操作が完了した後、screen.update()
を呼び出すことで、すべての変更が一度に表示されます。 - いつ使うか
複雑なアニメーションや、多数の描画操作を連続して行う場合に、ちらつきをなくしてスムーズな表示を実現したい場合。 - 例
import turtle import time screen = turtle.Screen() t = turtle.Turtle() t.speed(0) # 最速 t.hideturtle() # タートルを非表示にする # 自動更新を無効にする screen.tracer(0) print("tracer(0) を使用してスムーズに描画します。") for i in range(100): t.forward(i) t.left(90) # screen.update() を呼び出さないので、描画はまだ見えない # t.clear() や turtle.clearscreen() もこのループ内では通常使わない # すべての描画が完了したら、一度だけ画面を更新 screen.update() print("描画完了。") time.sleep(2) turtle.done()
- clearscreen()との併用
たとえば、アニメーションの各フレームで完全に画面をクリアしたいが、ちらつきをなくしたい場合は、以下のように組み合わせます。
この方法だと、各ステップで画面が一度完全にクリアされ、新しい描画が表示されるため、動きがリセットされるようなアニメーションに適しています。import turtle import time screen = turtle.Screen() t = turtle.Turtle() t.speed(0) t.hideturtle() # 自動更新を無効にする screen.tracer(0) for i in range(10): turtle.clearscreen() # 画面を完全にクリア(まだ見えない) t = turtle.Turtle() # 新しいタートルオブジェクトを取得(またはリセットされたものを利用) t.hideturtle() t.penup() t.goto(0, i * 10 - 50) t.pendown() t.circle(20) # 新しい描画(まだ見えない) screen.update() # ここで一気に表示 time.sleep(0.2) time.sleep(1) turtle.done()
- 説明
方法 | 目的 | 影響範囲 | 注意点 |
---|---|---|---|
turtle.clearscreen() | 画面全体をクリアし、すべてのタートルを初期状態にリセット | 画面全体、すべてのタートル | アニメーションではちらつきやすい。古いタートルはリセットされる。 |
turtle.clear() | 特定のタートルが描いたものだけを消す | 特定のタートルの描画のみ | タートルの位置、向き、設定は維持される。 |
turtle.reset() | 特定のタートルの描画を消し、そのタートルの状態を初期化 | 特定のタートルの描画と状態 | 他のタートルやその描画には影響しない。 |
screen.tracer(0) + screen.update() | 描画のちらつきをなくし、スムーズなアニメーションを実現 | 画面の更新タイミングの制御 | 描画のクリアではない。描画をまとめて表示するためのもの。 |