turtle.reset()

2025-06-06

turtle.reset() とは?

turtle.reset()は、Pythonのタートルグラフィックスにおいて、描画の状態を完全に初期化するためのメソッドです。

より具体的には、以下の3つのことを行います。

  1. 全ての描画をクリアする: これまでに描かれた線や図形を全て消去し、キャンバスをまっさらな状態に戻します。
  2. タートルの状態を初期位置に戻す: タートル(描画を行う「カメ」)を画面の中心(通常は座標 0,0)に移動させます。タートルの向きも初期状態(通常は東、つまり右方向)に戻します。
  3. タートルの設定を初期値に戻す: ペンの色、太さ、描画モード(ペンが上がっているか下がっているか)、描画速度など、タートルに関する全ての設定をデフォルトの状態に戻します。

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つのシナリオで具体的なコード例を見ていきましょう。

  1. 基本的な reset() の使用例
  2. reset()clear() の比較
  3. 複数のタートルオブジェクトと 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()関数であり、通常はスクリーン全体の描画をクリアし、デフォルトのタートルの状態をリセットします。この場合、pen1pen2の描画も全て消去されます。
  • その後、pen1 を紫色に設定し直して円を描画します。
  • pen1.reset() を呼び出すと、pen1 によって描かれた緑色の三角形のみが消去され、pen1 自体が画面中央に、初期設定で戻ります。pen2によって描かれた青い四角形はそのまま残ります
  • それぞれのタートルで異なる図形を描画します。turtle.tracer(0)turtle.update() を使うことで、描画プロセスを高速化し、描画完了後に一気に表示するようにしています。
  • pen1pen2 という2つの独立したタートルオブジェクトを作成します。


turtle.reset() が行う3つの主要な動作(描画のクリア、タートルの位置と向きの初期化、タートルの設定の初期化)を、それぞれ個別の関数で代替することが可能です。これにより、プログラムの要件に合わせてより柔軟な制御が可能になります。

代替手段は主に以下の通りです。

  1. 描画のみをクリアする
    turtle.clear() または screen.clear()
  2. タートルの位置と向きを初期化する
    turtle.home() または turtle.setheading(0)
  3. タートルの設定を初期化する(部分的に)
    各設定関数をデフォルト値で呼び出す

描画のみをクリアする

  • 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()