turtle.getshapes()

2025-06-06

タートルグラフィックスでは、画面上に表示される「タートル」の形を、いくつかのプリセットされた図形の中から選択したり、独自の図形(画像ファイルなど)を追加したりすることができます。turtle.getshapes() は、これらの利用可能な図形の一覧を確認するのに役立ちます。

具体的に何が返されるか:

この関数を実行すると、以下のような文字列のリストが返されることが一般的です。

['arrow', 'blank', 'circle', 'classic', 'square', 'triangle', 'turtle', ...]
  • 'turtle': 亀の形
  • 'triangle': 三角形の形
  • 'square': 四角い形
  • 'classic': 昔ながらのタートルグラフィックスのタートルの形
  • 'circle': 丸い形
  • 'blank': タートルを非表示にする(形がない)
  • 'arrow': 標準の矢印の形

もし turtle.addshape() を使って独自の図形(例えばGIF画像など)を追加した場合、その図形名もこのリストに含まれるようになります。

import turtle

# 利用可能なすべての図形の名前を取得
available_shapes = turtle.getshapes()

# リストを表示
print(available_shapes)

# 例えば、利用可能な図形の中から「turtle」を選択してタートルの形を変える
if 'turtle' in available_shapes:
    turtle.shape('turtle')
    turtle.forward(100)
else:
    print("「turtle」という図形は利用できませんでした。")

turtle.done() # ウィンドウを閉じずに表示を維持


NameError: name 'turtle' is not defined

エラーの原因
これは turtle.getshapes() に限らず、turtle モジュールの関数を使う際によくある最も基本的なエラーです。turtle モジュールをインポートし忘れている場合に発生します。

トラブルシューティング
コードの先頭で turtle モジュールを正しくインポートしているか確認してください。

# 悪い例 (NameErrorが発生)
# available_shapes = turtle.getshapes()

# 良い例
import turtle # これが必要
available_shapes = turtle.getshapes()
print(available_shapes)

AttributeError: module 'turtle' has no attribute 'getshapes'

エラーの原因
非常に稀ですが、Pythonのインストールが破損しているか、turtle という名前の別のファイルやモジュールがプロジェクト内に存在し、標準の turtle モジュールが上書きされている場合に発生する可能性があります。

トラブルシューティング

  • Pythonの再インストール
    Pythonのインストールが破損している可能性は低いですが、他の原因が考えられない場合は、Pythonを再インストールすることを検討してください。
  • ファイル名の確認
    自分のPythonスクリプトの名前が turtle.py になっていないか確認してください。もしそうであれば、Pythonは標準の turtle モジュールではなく、自分のスクリプトをインポートしようとしてしまいます。ファイル名を変更してください(例: my_turtle_program.py)。

カスタムシェイプが getshapes() のリストに表示されない

エラーの原因
turtle.addshape() を使ってカスタムシェイプを追加したにもかかわらず、turtle.getshapes() のリストにその名前が含まれていない場合。

トラブルシューティング

  • キャッシュの問題(ごく稀): 極めて稀なケースですが、Pythonの実行環境によっては、以前の状態がキャッシュされてしまうことがあります。プログラムを再起動するか、新しい環境で試してみてください。
  • addshape() の引数の問題
    turtle.addshape() の引数が正しいか確認してください。
    • 画像ファイルの場合
      GIF画像などのファイルパスを正しく指定していますか? ファイルが存在し、アクセス可能ですか?
    • ポリゴン(タプルのリスト)の場合
      ポリゴンの定義が正しい形式(座標のタプルのリスト)になっていますか?
  • addshape() の呼び出し忘れ
    turtle.addshape() を呼び出す前に turtle.getshapes() を呼び出していませんか? シェイプは addshape() で登録されて初めてリストに追加されます。

例:

import turtle

# 最初はデフォルトのシェイプのみ
print("初期のシェイプ:", turtle.getshapes())

# カスタムシェイプを追加
# ここではポリゴンを例にする
my_polygon = ((0,0), (50,0), (25,50))
turtle.addshape("my_triangle", my_polygon)

# 追加後に再度取得すると、カスタムシェイプが含まれる
print("カスタムシェイプ追加後のシェイプ:", turtle.getshapes())

# 追加したシェイプを使用する
turtle.shape("my_triangle")
turtle.forward(100)

turtle.done()

エラーの原因
これはエラーというよりは「勘違い」に近いですが、turtle.getshapes() が返すリストが、自分がタートルのシェイプとして設定したいと考えているものと一致しないという状況です。例えば、「この画像ファイルをシェイプとして使いたいのに、リストに表示されない」といったケース。

  • デフォルトシェイプの理解
    turtle.getshapes() が最初に返すリストには、arrow, classic, circle, square, triangle, turtle, blank といったデフォルトのプリセットシェイプが含まれます。これらの名前は常に利用可能です。
  • turtle.addshape() の使用
    画像ファイル(.gif)や独自のポリゴン(点のリスト)をタートルのシェイプとして使用したい場合は、turtle.addshape() を使って明示的に登録する必要があります。turtle.getshapes() は、登録されたシェイプのみを返します。


利用可能なすべての図形(シェイプ)の名前を取得して表示する

最も基本的な使用例です。現在 turtle モジュールに登録されているすべての図形名をリストで取得し、表示します。

import turtle

# 現在利用可能なすべての図形の名前を取得
available_shapes = turtle.getshapes()

print("現在利用可能なタートルの図形:")
for shape_name in available_shapes:
    print(f"- {shape_name}")

turtle.done() # ウィンドウが開いたままになるようにする

出力例

現在利用可能なタートルの図形:
- arrow
- blank
- circle
- classic
- square
- triangle
- turtle

(環境や追加のシェイプによっては、これ以外の名前も表示されることがあります)

特定の図形が存在するかどうかを確認し、それを使用する

turtle.getshapes() のリストに特定の図形が含まれているかを確認し、もしあればその図形をタートルに設定する例です。これは、プログラムが特定のカスタムシェイプに依存している場合などに役立ちます。

import turtle

# タートルオブジェクトを作成
t = turtle.Turtle()
t.speed(1) # 描画速度を遅くする

# 利用可能なシェイプのリストを取得
available_shapes = turtle.getshapes()

# 'turtle' というシェイプがあるか確認し、あれば設定する
if 'turtle' in available_shapes:
    print("「turtle」シェイプが利用可能です。設定します。")
    t.shape("turtle")
else:
    print("「turtle」シェイプは利用できません。デフォルトのシェイプを使用します。")

t.forward(100)
t.left(90)
t.forward(100)

turtle.done()

カスタムシェイプ(ポリゴン)を追加し、それがリストに含まれることを確認する

turtle.addshape() を使って新しい図形を登録し、turtle.getshapes() でそれが正しくリストに追加されたことを確認する例です。

import turtle

# 新しいタートルオブジェクトを作成
t = turtle.Turtle()
t.speed(1)
t.penup() # ペンを上げて移動

# 1. カスタムシェイプを定義する(例: 星形)
# 星の頂点の座標をタプルのリストとして定義
star_points = [
    (0, 50), (10, 20), (40, 20), (20, 0), (30, -30),
    (0, -10), (-30, -30), (-20, 0), (-40, 20), (-10, 20)
]

# 2. 新しいシェイプを 'my_star' という名前で登録
turtle.addshape("my_star", star_points)
print(f"カスタムシェイプ 'my_star' を登録しました。")

# 3. getshapes() で登録されたことを確認
current_shapes = turtle.getshapes()
print(f"現在の利用可能なシェイプ: {current_shapes}")

if "my_star" in current_shapes:
    print("'my_star' シェイプがリストに存在します。")
    t.shape("my_star") # タートルの形を星形に設定
    t.color("gold")    # 色を金色に設定
    t.stamp()          # 星形をスタンプする(描画する)

t.goto(50, 50) # 少し移動してもう一つスタンプ
t.stamp()

turtle.done()

外部のGIF画像ファイルをタートルのシェイプとして登録し、getshapes() でその名前が表示されることを確認する例です。このコードを実行するには、my_image.gif という名前のGIF画像ファイルがスクリプトと同じディレクトリにある必要があります。

import turtle
import os # ファイルパスの確認のためにインポート

# 新しいタートルオブジェクトを作成
t = turtle.Turtle()
t.speed(0) # 最速

# GIF画像のパス
image_file = "my_image.gif" # 例: スクリプトと同じディレクトリにこのファイルがあること

# ファイルが存在するか確認
if not os.path.exists(image_file):
    print(f"エラー: '{image_file}' が見つかりません。")
    print("このコードを実行するには、GIF画像ファイルが必要です。")
else:
    # 1. GIF画像をシェイプとして登録
    try:
        turtle.addshape(image_file) # ファイル名がそのままシェイプ名になる
        print(f"GIF画像 '{image_file}' をシェイプとして登録しました。")

        # 2. getshapes() で登録されたことを確認
        current_shapes = turtle.getshapes()
        print(f"現在の利用可能なシェイプ: {current_shapes}")

        if image_file in current_shapes:
            print(f"'{image_file}' シェイプがリストに存在します。")
            t.shape(image_file) # タートルの形をGIF画像に設定
            t.stamp() # 画像をスタンプする

            t.goto(100, 50)
            t.stamp()
        else:
            print(f"'{image_file}' シェイプがリストに存在しませんでした。")

    except turtle.TurtleGraphicsError as e:
        print(f"GIF画像の読み込み中にエラーが発生しました: {e}")
        print("ファイルが正しいGIF形式であるか、破損していないか確認してください。")

turtle.done()


しかし、turtle.getshapes() が提供する情報(利用可能なシェイプのリスト)を得るための代替の思考やアプローチ、あるいは関連する他の操作について説明することはできます。

turtle.getshapes() の情報が不要な場合の代替アプローチ

多くの場合、turtle.getshapes() を呼び出す必要がないこともあります。

  • プログラムが追加したカスタムシェイプのみを使う場合
    自分が turtle.addshape() で追加したシェイプだけを使う場合は、そのシェイプの名前を自分で知っているため、getshapes() でリストを確認する必要はありません。

    import turtle
    t = turtle.Turtle()
    my_polygon = ((0,0), (10,10), (0,20), (-10,10))
    turtle.addshape("my_diamond", my_polygon) # 自分で名前を定義
    t.shape("my_diamond") # その名前を直接使う
    t.forward(50)
    turtle.done()
    
  • 特定の既知のシェイプを使う場合
    もしプログラムが常に arrowturtle のような既知のデフォルトシェイプしか使わないのであれば、getshapes() を呼び出してリストを確認する必要はありません。直接 turtle.shape("arrow") のように呼び出せば十分です。

    import turtle
    t = turtle.Turtle()
    t.shape("classic") # 直接、既知のシェイプを設定
    t.forward(50)
    turtle.done()
    

Pythonの turtle モジュールの内部実装に深く踏み込むことで、登録されているシェイプの情報を間接的に取得する方法も理論上は考えられますが、これは非常に非推奨であり、将来のPythonのバージョンで動作しなくなる可能性があります。

turtle モジュールは内部で、登録されたシェイプを辞書のようなデータ構造で管理しています。例えば、_Screen._shapes のような属性にアクセスすることで、その情報を「覗き見」できる可能性があります。

import turtle

# 非推奨: turtleモジュールの内部実装に依存
try:
    # _Screen._shapes は内部属性であり、アクセスを推奨しません
    # 将来のバージョンで変更される可能性があります
    screen = turtle.Screen()
    internal_shapes = screen._shapes
    print("内部的に見られるシェイプデータ (非推奨):", internal_shapes.keys())
except AttributeError:
    print("このバージョンのturtleでは、内部属性にアクセスできませんでした。")

print("getshapes() による正規の方法:", turtle.getshapes())

turtle.done()

なぜ非推奨なのか?

  • 公式ドキュメント
    公式ドキュメントに記載されていない方法は、その動作が保証されません。
  • 可読性・保守性
    このような内部実装に依存したコードは理解しにくく、将来的なメンテナンスが困難になります。
  • 安定性
    _shapes のようなアンダースコア(_)で始まる属性は、モジュールの内部実装を示すものであり、Pythonのバージョンアップによって予告なく変更・削除される可能性があります。
  1. turtle.getshapes() からの情報がそもそも必要ない場合
    これは「代替方法」というよりは、「その関数を使わない選択」です。必要なシェイプ名が既知である場合や、自分で登録したシェイプの名前を覚えている場合は、直接 turtle.shape() を使います。

  2. turtle.getshapes() と全く同じ情報を得る目的の場合
    この場合、turtle.getshapes() こそが唯一の公式かつ推奨される方法です。他の「代替」は、内部実装に依存するハック的な方法であり、使用すべきではありません。