turtle.reset()
turtle.reset()
とは?
turtle.reset()
は、Pythonのタートルグラフィックスにおいて、描画の状態を完全に初期化するためのメソッドです。
より具体的には、以下の3つのことを行います。
- 全ての描画をクリアする: これまでに描かれた線や図形を全て消去し、キャンバスをまっさらな状態に戻します。
- タートルの状態を初期位置に戻す: タートル(描画を行う「カメ」)を画面の中心(通常は座標 0,0)に移動させます。タートルの向きも初期状態(通常は東、つまり右方向)に戻します。
- タートルの設定を初期値に戻す: ペンの色、太さ、描画モード(ペンが上がっているか下がっているか)、描画速度など、タートルに関する全ての設定をデフォルトの状態に戻します。
turtle.clear()
との違い
turtle.reset()
と似た機能を持つものにturtle.clear()
があります。この2つの主な違いは以下の通りです。
turtle.reset()
: 描画内容を消去するだけでなく、タートルの位置、向き、全ての設定を初期化します。全く新しい描画セッションを開始したい場合や、プログラムを最初からやり直したい場合に適しています。turtle.clear()
: 描画された内容だけを消去します。タートルの位置、向き、設定は変更されません。現在のタートルの位置から引き続き描画を開始したい場合に便利です。
以下にturtle.reset()
の簡単な使用例を示します。
import turtle
# タートルを初期化(最初の状態)
turtle.setup(width=600, height=400) # ウィンドウサイズを設定
turtle.speed(1) # 描画速度を設定
# 四角形を描画
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
# 少し待つ
turtle.sleep(2)
# reset() を呼び出す
# 描画が消去され、タートルが中央に、設定が初期状態に戻る
turtle.reset()
# reset後、新しい描画を開始
turtle.color("red") # 色を赤に設定
turtle.circle(50) # 円を描画
# ウィンドウを閉じるまで待機
turtle.done()
このコードを実行すると、まず青い四角形が描かれ、2秒後に画面がクリアされてタートルが中央に戻り、その後赤い円が描かれるのが確認できます。
reset()を呼び出したのに、画面がクリアされない、またはタートルが初期位置に戻らない
-
原因3: 複数のタートルオブジェクトが存在する
- もしプログラム内で複数の
Turtle
オブジェクト(例:pen1 = turtle.Turtle()
,pen2 = turtle.Turtle()
)を作成している場合、turtle.reset()
はデフォルトのタートル、または最後にアクティブになったタートルに影響を与える可能性があります。 - 特定のタートルオブジェクトのみをリセットしたい場合は、そのオブジェクトのメソッドとして呼び出す必要があります。例:
pen1.reset()
トラブルシューティング
- コードを見直し、どのタートルオブジェクトをリセットしたいのか明確にしてください。
- もしデフォルトのタートル(
import turtle
で利用できる直接の関数)を使用しているのであれば、turtle.reset()
で問題ありません。 - 特定のタートルオブジェクトを操作しているのであれば、
my_turtle_object.reset()
のように呼び出しているか確認してください。
- もしプログラム内で複数の
-
原因2:
turtle.clear()
との混同turtle.clear()
は描画だけを消去し、タートルの位置や設定は変更しません。turtle.reset()
は描画を消去し、タートルの位置、向き、色、ペンの太さなど全ての設定を初期化します。- 「描画だけ消したいのに、タートルが中心に戻ってしまった」という場合は、
clear()
を使いたかった可能性があります。
-
import turtle
とした場合、turtle.reset()
を呼び出す必要があります。from turtle import *
とした場合、単にreset()
を呼び出します。- 複数のタートルオブジェクト(例:
t = turtle.Turtle()
)を使用している場合、turtle.reset()
は「デフォルトのタートル」に作用します。もし特定のタートルオブジェクトをリセットしたい場合は、そのオブジェクトのメソッドとしてt.reset()
を呼び出す必要があります。
reset()を呼び出した後、プログラムがすぐに終了してしまう
-
原因:
turtle.done()
やturtle.mainloop()
の欠如turtle
グラフィックスウィンドウは、プログラムが終了すると同時に閉じられます。turtle.done()
またはturtle.mainloop()
は、ウィンドウを閉じずに表示を維持し、ユーザーの操作(例えばウィンドウを閉じるボタンをクリックするなど)を待つためのイベントループを開始します。reset()
を呼び出した後にこれらの関数がないと、リセットされた状態が一瞬表示された後、すぐにウィンドウが閉じてしまいます。
トラブルシューティング
turtle.reset()
の後に、必ずturtle.done()
またはturtle.mainloop()
をコードの最後に配置してください。
import turtle # 何らかの描画... turtle.reset() # ここでリセット # リセット後の描画... turtle.done() # ウィンドウを閉じずに待機
reset()を呼び出した後、タートルの描画速度や形状、色が元に戻ってしまった
-
原因:
reset()
の仕様を理解していない- 前述の通り、
turtle.reset()
は描画内容だけでなく、タートルに関する全ての設定を初期化します。これには、色 (color()
)、ペンの太さ (pensize()
)、形状 (shape()
)、速度 (speed()
) などが含まれます。 - これはエラーではなく、
reset()
の意図された動作です。
トラブルシューティング
- もし一部の設定だけを保持したい場合は、
reset()
の後に再度それらの設定を行う必要があります。 - あるいは、描画内容だけをクリアしたいのであれば、
turtle.clear()
を使用することを検討してください。
import turtle turtle.color("blue") turtle.pensize(5) turtle.speed(1) turtle.forward(100) # 色と太さを保持したまま、描画だけを消したい場合 # turtle.clear() # 全てを初期化したい場合 turtle.reset() # reset() 後に再度設定し直す turtle.color("green") # 再度色を設定 turtle.pensize(3) # 再度ペンの太さを設定 turtle.circle(50) turtle.done()
- 前述の通り、
AttributeError: 'module' object has no attribute 'reset'
-
原因:
turtle
モジュールが正しくインポートされていない、または異なる名前の変数が存在する- このエラーは、
turtle.reset()
を呼び出そうとしているのに、turtle
という名前がモジュールではなく、別のオブジェクト(例えば、自分で作った変数など)を参照している場合に発生します。 - または、Pythonの環境が壊れている、あるいは
turtle
モジュールが正しくインストールされていない可能性もごく稀にあります。
トラブルシューティング
- コードの先頭に
import turtle
が正しく記述されているか確認してください。 - コード内で
turtle
という名前の変数を作成していないか確認してください(例:turtle = 123
のような行がないか)。 - もしIDLEなどで作業していて問題が発生する場合は、一度Pythonシェルを再起動してみてください。
- このエラーは、
turtle.reset()
は、タートルグラフィックスの状態を完全に初期化するために使われます。以下の3つのシナリオで具体的なコード例を見ていきましょう。
- 基本的な
reset()
の使用例 reset()
とclear()
の比較- 複数のタートルオブジェクトと
reset()
基本的な reset() の使用例
この例では、まずタートルで図形を描画し、その後 turtle.reset()
を呼び出して全てを初期化し、別の図形を描画します。
import turtle
import time # 時間を一時停止するために使用
# 1. 初期設定
# ウィンドウのセットアップ
turtle.setup(width=600, height=400)
# 描画速度を速めに設定
turtle.speed(0) # 0が最速
print("--- 最初の描画 ---")
# 2. 最初の描画:青い四角形
turtle.color("blue")
turtle.pensize(3)
turtle.penup() # ペンを上げて移動
turtle.goto(-150, 50) # 開始位置へ移動
turtle.pendown() # ペンを下ろす
for _ in range(4):
turtle.forward(100)
turtle.right(90)
print("四角形を描画しました。2秒間待機します。")
time.sleep(2) # 2秒間一時停止
print("--- turtle.reset() の呼び出し ---")
# 3. turtle.reset() を呼び出す
# これにより、
# - 画面上の描画が全て消去される
# - タートルが中央 (0,0) に戻る
# - タートルの向きが右 (東) に戻る
# - ペンの色、太さ、描画モード (penup/pendown)、速度など全ての設定が初期値に戻る
turtle.reset()
print("reset() を実行しました。画面がクリアされ、タートルが初期状態に戻りました。")
time.sleep(2) # 2秒間一時停止
print("--- reset() 後の描画 ---")
# 4. reset() 後の描画:赤い円
# reset() で全ての設定が初期化されたため、再度設定し直す必要がある
turtle.color("red")
turtle.pensize(2)
turtle.speed(1) # 描画速度を少し遅めに設定
turtle.circle(80) # 半径80の円を描画
print("赤い円を描画しました。")
# 描画ウィンドウを閉じずに待機
turtle.done()
print("プログラム終了。")
解説
reset()
の後に描画する赤い円は、再度turtle.color("red")
やturtle.pensize(2)
を設定しないと、デフォルトの黒色で細い線で描画されます。turtle.reset()
が呼び出されると、瞬時に画面がクリアされ、タートルが中央に移動し、全ての描画設定(色、太さ、速度など)がデフォルト値に戻ります。time.sleep(2)
で一時停止することで、四角形が描画された状態を確認できます。- 最初に青い四角形を描画します。
turtle.color("blue")
やturtle.pensize(3)
で設定した値が適用されます。
reset() と clear() の比較
この例では、turtle.clear()
が描画のみを消去し、turtle.reset()
が全てを初期化する違いを示します。
import turtle
import time
turtle.setup(width=600, height=400)
turtle.speed(0)
print("--- 最初の描画 ---")
turtle.color("purple")
turtle.pensize(4)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
print("紫色のL字型を描画しました。")
print(f"現在のタートル位置: {turtle.pos()}, 向き: {turtle.heading()}")
print(f"現在のペン色: {turtle.pencolor()}, ペンサイズ: {turtle.pensize()}")
time.sleep(2)
print("\n--- turtle.clear() の呼び出し ---")
# turtle.clear() は描画のみを消去
turtle.clear()
print("clear() を実行しました。描画は消えましたが、タートルの状態は維持されます。")
print(f"現在のタートル位置: {turtle.pos()}, 向き: {turtle.heading()}")
print(f"現在のペン色: {turtle.pencolor()}, ペンサイズ: {turtle.pensize()}") # 色とサイズは保持されているはず
time.sleep(2)
print("\n--- clear() 後の描画 ---")
# clear() の後、タートルの位置、向き、設定は変わっていないので、そのまま描画を続ける
turtle.circle(50)
print("clear() の後、同じ位置と設定で円を描画しました。")
time.sleep(2)
print("\n--- turtle.reset() の呼び出し ---")
# turtle.reset() は全てを初期化
turtle.reset()
print("reset() を実行しました。描画が消去され、タートルが初期状態に戻りました。")
print(f"現在のタートル位置: {turtle.pos()}, 向き: {turtle.heading()}") # 位置と向きが初期化されているはず
print(f"現在のペン色: {turtle.pencolor()}, ペンサイズ: {turtle.pensize()}") # 色とサイズが初期化されているはず (通常は黒、1)
time.sleep(2)
print("\n--- reset() 後の描画 ---")
# reset() の後、設定は初期化されたので、再度設定する必要がある
turtle.color("orange")
turtle.pensize(2)
turtle.dot(20) # 点を描画
print("reset() の後、新しい設定で点を描画しました。")
turtle.done()
print("プログラム終了。")
解説
- 次に
reset()
を呼び出すと、画面がクリアされるだけでなく、タートルの位置が原点に戻り、向きが初期値に戻り、ペンの色もデフォルト(黒)、太さもデフォルト(1)にリセットされていることが確認できます。そのため、reset()
の後に描画したオレンジ色の点は、新たに設定し直した色と太さで、中心から描画されます。 - 最初の紫色のL字型を描画した後、
clear()
を呼び出します。画面上のL字型は消えますが、その後のprint()
文で確認できるように、タートルの位置、向き、ペンの色や太さは変わっていません。そのため、clear()
の後に描画した円は、その位置と設定から引き継がれて描画されます。
複数のタートルオブジェクトと reset()
turtle.Turtle()
を使って複数のタートルオブジェクトを作成した場合、それぞれのタートルは独立しています。turtle.reset()
は、通常、デフォルトのスクリーンまたは最後にアクティブになったタートルに関連する状態をリセットするのに影響します。特定のタートルオブジェクトをリセットしたい場合は、そのオブジェクトのメソッドとして reset()
を呼び出す必要があります。
import turtle
import time
turtle.setup(width=700, height=500)
turtle.tracer(0) # 描画を速くするためにトレーサーをオフにする
# 1. 2つのタートルオブジェクトを作成
pen1 = turtle.Turtle()
pen2 = turtle.Turtle()
# 2. pen1 の初期設定と描画
print("--- pen1 の描画 ---")
pen1.speed(0)
pen1.color("green")
pen1.pensize(3)
pen1.penup()
pen1.goto(-200, 0)
pen1.pendown()
for _ in range(3): # 三角形を描画
pen1.forward(100)
pen1.left(120)
# 3. pen2 の初期設定と描画
print("--- pen2 の描画 ---")
pen2.speed(0)
pen2.color("blue")
pen2.pensize(2)
pen2.penup()
pen2.goto(100, 0)
pen2.pendown()
for _ in range(4): # 四角形を描画
pen2.forward(80)
pen2.right(90)
turtle.update() # tracer(0) の場合、update() で描画を更新
print("2つのタートルで描画しました。2秒間待機します。")
time.sleep(2)
print("\n--- pen1.reset() の呼び出し ---")
# pen1 のみをリセットする
pen1.reset()
# pen1 の描画が消え、pen1 が初期状態に戻る
# pen2 の描画と状態はそのまま
turtle.update() # 描画を更新
print("pen1.reset() を実行しました。pen1の描画と状態のみが初期化されました。")
print(f"pen1 の位置: {pen1.pos()}, pen2 の位置: {pen2.pos()}") # pen2はそのままのはず
time.sleep(2)
print("\n--- pen1 の再描画 ---")
# pen1 はリセットされたので、再度設定して描画
pen1.color("purple")
pen1.circle(60)
turtle.update() # 描画を更新
print("pen1 で紫色で円を描画しました。")
time.sleep(2)
print("\n--- turtle.reset() の呼び出し (スクリーン全体のリセット) ---")
# デフォルトのタートル機能としての reset()
# これにより、画面上の全ての描画が消え、デフォルトのタートルが初期化される
# 通常は、全てのタートルオブジェクトが作られたスクリーン全体のリセットになる
turtle.reset()
turtle.update() # 描画を更新
print("turtle.reset() を実行しました。画面上の全ての描画が消去されました。")
time.sleep(2)
print("\n--- 全体リセット後の描画 ---")
# 全体リセット後なので、再度設定し直す
turtle.color("brown")
turtle.pensize(5)
turtle.forward(150)
turtle.update() # 描画を更新
print("新しい茶色の線を描画しました。")
turtle.done()
print("プログラム終了。")
- 最後に
turtle.reset()
を呼び出します。これは、import turtle
で利用できるモジュールレベルのreset()
関数であり、通常はスクリーン全体の描画をクリアし、デフォルトのタートルの状態をリセットします。この場合、pen1
とpen2
の描画も全て消去されます。 - その後、
pen1
を紫色に設定し直して円を描画します。 pen1.reset()
を呼び出すと、pen1
によって描かれた緑色の三角形のみが消去され、pen1
自体が画面中央に、初期設定で戻ります。pen2
によって描かれた青い四角形はそのまま残ります。- それぞれのタートルで異なる図形を描画します。
turtle.tracer(0)
とturtle.update()
を使うことで、描画プロセスを高速化し、描画完了後に一気に表示するようにしています。 pen1
とpen2
という2つの独立したタートルオブジェクトを作成します。
turtle.reset()
が行う3つの主要な動作(描画のクリア、タートルの位置と向きの初期化、タートルの設定の初期化)を、それぞれ個別の関数で代替することが可能です。これにより、プログラムの要件に合わせてより柔軟な制御が可能になります。
代替手段は主に以下の通りです。
- 描画のみをクリアする
turtle.clear()
またはscreen.clear()
- タートルの位置と向きを初期化する
turtle.home()
またはturtle.setheading(0)
- タートルの設定を初期化する(部分的に)
各設定関数をデフォルト値で呼び出す
描画のみをクリアする
-
screen.clear()
またはturtle.Screen().clear()
- 説明
スクリーン全体(すべてのタートルが描いたもの)を消去します。しかし、これもタートルの位置や設定は変更しません。 - 用途
画面上のすべての描画を消去したいが、個々のタートルの現在の状態は保持したい場合に便利です。
- 説明
-
- 説明
現在のタートルが描いた線や図形のみを画面から消去します。タートルの位置、向き、色、太さなどの設定は変更されません。 - 用途
現在のタートルの位置から描画を続けたいが、古い描画は消したい場合に最適です。 - 複数のタートルオブジェクトの場合
各タートルオブジェクト (my_turtle.clear()
) ごとに呼び出す必要があります。
- 説明
コード例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("lightblue") # 背景色を設定
t = turtle.Turtle()
t.speed(1)
t.pensize(3)
t.color("purple")
print("--- 最初の描画 ---")
t.circle(80) # 紫色の円を描画
print(f"円を描画しました。タートル位置: {t.pos()}, 向き: {t.heading()}")
time.sleep(2)
print("\n--- t.clear() の呼び出し ---")
# tが描いた円だけを消去
t.clear()
print("t.clear() を実行しました。描画のみ消去されました。")
print(f"タートル位置: {t.pos()}, 向き: {t.heading()}") # 位置と向きは変わっていない
print(f"ペン色: {t.pencolor()}, ペンサイズ: {t.pensize()}") # 設定も変わっていない
time.sleep(2)
print("\n--- t.clear() 後に続けて描画 ---")
# 同じ位置と設定で三角形を描画
for _ in range(3):
t.forward(100)
t.left(120)
print("三角形を描画しました。")
time.sleep(2)
# 別なタートルを作成し、描画
t2 = turtle.Turtle()
t2.speed(1)
t2.color("orange")
t2.pensize(2)
t2.penup()
t2.goto(-200, -100)
t2.pendown()
t2.forward(150)
print("別のタートル(t2)で線を描画しました。")
time.sleep(2)
print("\n--- screen.clear() の呼び出し ---")
# スクリーン全体の描画を消去
screen.clear()
print("screen.clear() を実行しました。画面上の全ての描画が消去されました。")
# tとt2の位置や設定は変わっていないことに注意
print(f"t の位置: {t.pos()}, t2 の位置: {t2.pos()}")
time.sleep(2)
turtle.done()
タートルの位置と向きを初期化する
-
turtle.setheading(angle)
またはmy_turtle.setheading(angle)
- 説明
タートルの向きを指定された角度に設定します(0度が東、90度が北など)。 - 用途
向きだけを初期化したい場合や、特定の角度に設定したい場合に使用します。
- 説明
-
turtle.goto(x, y)
またはmy_turtle.goto(x, y)
- 説明
タートルを指定された座標 (x,y) に移動させます。 - 用途
原点以外の任意の場所にタートルを移動させたい場合に便利です。
- 説明
-
turtle.home()
またはmy_turtle.home()
- 説明
タートルを原点(通常は 0,0)に移動させ、向きを初期方向(通常は東、0度)に設定します。 - 用途
描画は消したくないが、タートルを特定の場所に戻したい場合に有効です。
- 説明
コード例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=600, height=400)
t = turtle.Turtle()
t.speed(1)
t.pensize(4)
t.color("green")
print("--- 最初の描画 ---")
t.forward(100)
t.left(90)
t.forward(50)
print(f"線を描画しました。タートル位置: {t.pos()}, 向き: {t.heading()}")
time.sleep(2)
print("\n--- t.home() の呼び出し ---")
# タートルを原点に戻し、向きを0度にする(描画は消えない)
t.home()
print("t.home() を実行しました。タートルが原点に戻り、向きが初期化されました。")
print(f"タートル位置: {t.pos()}, 向き: {t.heading()}")
time.sleep(2)
print("\n--- home() 後に続けて描画 ---")
# 原点から新しい線を描画
t.color("red")
t.forward(80)
print("原点から赤い線を描画しました。")
time.sleep(2)
print("\n--- t.goto() と t.setheading() の呼び出し ---")
# 特定の場所と向きに移動
t.penup() # 線を描かずに移動
t.goto(150, -50)
t.setheading(180) # 西向きに設定 (180度)
t.pendown()
t.color("blue")
t.forward(120)
print(f"特定の場所と向きに移動して描画しました。タートル位置: {t.pos()}, 向き: {t.heading()}")
turtle.done()
タートルの設定を初期化する(部分的に)
turtle.reset()
はペンの色、太さ、形状、速度、描画モード(ペンアップ/ダウン)など、多くの設定を初期化します。これらの設定を個別にデフォルト値に戻すには、それぞれの設定関数を呼び出します。
turtle.fillcolor("black")
(塗りつぶしの色)turtle.pendown()
(デフォルトはペンダウン)turtle.shape("classic")
(デフォルトの形状)turtle.speed(6)
(デフォルトの速度は通常6)turtle.pensize(1)
turtle.pencolor("black")
turtle.color("black")
コード例
import turtle
import time
screen = turtle.Screen()
screen.setup(width=600, height=400)
t = turtle.Turtle()
t.speed(1)
print("--- 最初の描画と設定 ---")
t.color("purple")
t.pensize(5)
t.shape("turtle") # タートルの形状をカメにする
t.speed(1) # 速度を遅くする
t.forward(100)
t.left(90)
t.forward(50)
print(f"タートル設定: 色={t.pencolor()}, 太さ={t.pensize()}, 形状={t.shape()}, 速度={t.speed()}")
time.sleep(2)
print("\n--- 個別に設定を初期化 ---")
# 描画はクリアしない
t.clear() # 描画のみクリア
# 設定を個別にデフォルトに戻す
t.color("black") # デフォルト色
t.pencolor("black") # ペン色もデフォルト
t.pensize(1) # デフォルトの太さ
t.shape("classic") # デフォルトの形状
t.speed(6) # デフォルトの速度
t.pendown() # デフォルトはペンダウン
print("設定を個別にデフォルトに戻しました。")
print(f"タートル設定: 色={t.pencolor()}, 太さ={t.pensize()}, 形状={t.shape()}, 速度={t.speed()}")
time.sleep(2)
print("\n--- 設定初期化後の描画 ---")
t.forward(100)
t.right(90)
t.forward(100)
print("デフォルト設定で描画しました。")
turtle.done()
turtle.reset()
は便利ですが、その動作が「やりすぎ」であると感じる場合は、これらの代替手段を組み合わせることで、より詳細な制御が可能になります。
- 特定の設定だけをデフォルトに戻したい
各設定関数をデフォルト値で呼び出す - タートルの位置と向きだけを戻したい
home()
やgoto()
,setheading()
- 描画だけを消したい
clear()