Explanation (turtle)

2025-06-06

  • Are you reading a book or a tutorial that uses this phrase? If so, what is the title or source?


NameError: name 'turtle' is not defined または NameError: name 'forward' is not defined

これは最もよくあるエラーの一つです。turtleモジュールをインポートし忘れているか、間違った方法でインポートしています。

エラーメッセージの例

NameError: name 'turtle' is not defined

または

NameError: name 'forward' is not defined

原因

  • import turtle as t のようにエイリアスを付けているのに、turtle.forward() のようにエイリアスを使わずに呼び出している(この場合、t.forward() とすべき)。
  • from turtle import * を使っているのに、turtle.forward() のようにモジュール名を付けて関数を呼び出している(この場合、forward() だけで良い)。
  • import turtle をコードの冒頭に記述していない。

トラブルシューティング

  • コードの先頭に必ず import turtle または from turtle import * を記述してください。
    • import turtle を使用する場合:
      import turtle
      # ...
      turtle.forward(100)
      
    • from turtle import * を使用する場合:
      from turtle import *
      # ...
      forward(100) # 'turtle.' は不要
      
    • 特定の関数のみをインポートする場合:
      from turtle import Turtle, Screen
      # ...
      my_turtle = Turtle()
      my_turtle.forward(100)
      
    • エイリアスを使用する場合:
      import turtle as t
      # ...
      t.forward(100)
      

ウィンドウがすぐに閉じてしまう(done() の忘れ)

現象
プログラムを実行しても、カメさんが絵を描く様子が見えないまま、ウィンドウが一瞬表示されてすぐに消えてしまう。

原因
turtleグラフィックスウィンドウは、プログラムの実行が終了すると自動的に閉じます。ユーザーがウィンドウを見続けるための指示がないためです。

トラブルシューティング
プログラムの最後に turtle.done() または turtle.exitonclick() を追加してください。

  • turtle.exitonclick(): ウィンドウがクリックされるまで開いたままにし、クリックされるとウィンドウが閉じるようにします。
    import turtle
    
    t = turtle.Turtle()
    t.forward(100)
    t.left(90)
    t.forward(100)
    
    turtle.done() # または turtle.exitonclick()
    
  • turtle.done(): グラフィックウィンドウを開いたままにして、手動で閉じるまでプログラムを待機させます。

ファイル名が turtle.py になっている

現象
turtleモジュールをインポートしようとすると、AttributeErrorModuleNotFoundErrorが発生したり、プログラムが正しく動作しない。

エラーメッセージの例

AttributeError: module 'turtle' has no attribute 'forward'
ModuleNotFoundError: No module named 'turtle'; 'turtle' is not a package

原因
作成したPythonスクリプトのファイル名を turtle.py にしてしまうと、Pythonインタプリタは標準のturtleモジュールではなく、自分で作成したturtle.pyファイルをインポートしようとします。その結果、必要な関数が見つからずにエラーが発生します。

トラブルシューティング
ファイル名を my_turtle_drawing.pydrawing_app.py のように、turtle.py 以外の名前に変更してください。

スペルミスや大文字・小文字の区別(AttributeError)

現象
turtleのメソッド(例: forward, left, Screen, Turtle など)を呼び出そうとするとエラーが発生する。

エラーメッセージの例

AttributeError: 'Turtle' object has no attribute 'forword'

forward のスペルミス) または

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

turtle.Turtle()Turtle の大文字忘れ)

原因
Pythonは大文字と小文字を区別します。また、関数名やメソッド名のスペルミスはよくあるエラーです。

トラブルシューティング

  • turtle.forward() のような関数名(小文字)と混同しないようにしましょう。
  • 特に turtle.Turtle() のようにクラス名を呼び出す場合は、最初の文字が大文字であることに注意してください。
  • エラーメッセージに示されている関数名やメソッド名を慎重に確認し、正しいスペルと大文字・小文字で記述されているか確認してください。

引数の間違い(TypeError)

現象
関数やメソッドに渡す引数の型や数が間違っているとエラーが発生する。

エラーメッセージの例

TypeError: forward() missing 1 required positional argument: 'distance'

forward() に距離を指定していない) または

TypeError: 'str' object cannot be interpreted as an integer

(数字を渡すべき引数に文字列を渡している)

原因
forward()left() のような多くのturtle関数は、引数を必要とします(例: forward(100) は100ピクセル進む)。引数の型が間違っている場合も同様にエラーになります。

トラブルシューティング

  • 例えば forward() には数字(整数または浮動小数点数)を渡す必要があります。
    • 良い例
      t.forward(100)
    • 悪い例
      t.forward() (引数がない)、t.forward("100") (文字列)
  • エラーメッセージをよく読み、どの引数が不足しているか、またはどの引数の型が間違っているかを確認してください。

ウィンドウがフリーズする、反応しない

現象
プログラムを実行すると、カメさんは絵を描くが、ウィンドウがフリーズして操作を受け付けなくなる。特に無限ループを使用している場合に発生しやすい。

原因
turtleグラフィックスは通常、イベント駆動型で動作します。無限ループなどでプログラムがturtleイベントを処理する機会がない場合、ウィンドウが応答しなくなります。

トラブルシューティング

  • アニメーションの速度を制御するために screen.tracer(0)screen.update() を使用している場合、update() を適切に呼び出す必要があります。
  • イベントループを適切に終了させるか、turtle.done() または turtle.exitonclick() を使用しているか確認してください。

環境に依存する問題 (特にMacやLinux)

現象
特定の環境でturtleがうまく起動しない、または表示がおかしい。

原因
turtleモジュールはtkinterというGUIライブラリに基づいていますが、環境によってはtkinterのセットアップが不十分な場合があります。

  • 使用しているPythonのバージョンが古い場合、最新版にアップデートを検討してください。
  • Linuxの場合
    tkinterをインストールする必要がある場合があります。
    sudo apt-get install python3-tk  # Ubuntu/Debianの場合
    sudo dnf install python3-tkinter # Fedora/CentOSの場合
    
  • Macの場合
    macOSのバージョンによっては、tkinterが別途インストールされていないと動作しないことがあります。Homebrewなどを使ってPythonやtkinterをインストールし直すことで解決する場合があります。
    brew install python-tk
    


基本的な動き:四角形を描く

最も基本的な例として、四角形を描いてみましょう。

import turtle # turtleモジュールをインポートします

# 1. スクリーンとタートルオブジェクトの作成
screen = turtle.Screen() # 描画する画面(スクリーン)を作成
screen.bgcolor("lightblue") # 背景色を薄い青に設定
screen.title("四角形を描く") # ウィンドウのタイトルを設定

my_turtle = turtle.Turtle() # カメ(タートル)オブジェクトを作成
my_turtle.shape("turtle") # カメの形を「カメ」アイコンに設定
my_turtle.color("darkgreen") # カメの色を濃い緑に設定
my_turtle.pensize(3) # ペンの太さを3ピクセルに設定

# 2. 四角形を描く
for _ in range(4): # 4回繰り返します(四角形には4つの辺があるため)
    my_turtle.forward(100) # カメを100ピクセル前進させます
    my_turtle.right(90) # カメを右に90度回転させます

# 3. 描画終了後の処理
turtle.done() # 描画ウィンドウが開いたままになるようにします。ユーザーが閉じるまで待機します。

解説

  • turtle.done(): これがないと、プログラムが終了すると同時にウィンドウが閉じてしまいます。この行があることで、ユーザーが手動でウィンドウを閉じるまで表示が維持されます。デバッグや結果の確認に重要です。
  • my_turtle.right(90): カメがその場で右に90度回転します。これは向きを変えるだけで、線は描きません。
  • my_turtle.forward(100): カメが現在の向きに100ピクセル前進します。ペンが下りている(初期設定)場合、線が描かれます。
  • for _ in range(4)
    : これはPythonのforループです。range(4)は0から3までの数字を生成するので、ループ内の処理が4回繰り返されます。_(アンダースコア)は、ループ変数を使わないときに慣習的に使われます。
  • my_turtle.pensize(3): カメが描く線の太さをピクセル単位で設定します。
  • my_turtle.color("darkgreen"): カメが描く線の色を設定します。色の名前("red", "blue"など)や、RGBの16進数コード(例: "#FF0000")も使えます。
  • my_turtle.shape("turtle"): カメの形状を設定します。デフォルトは矢印ですが、"turtle", "circle", "square", "triangle", "arrow", "classic" などに変更できます。
  • my_turtle = turtle.Turtle(): 実際に絵を描く「カメ」(描画エージェント)のオブジェクトを作成します。複数のカメを作成することも可能です。
  • screen = turtle.Screen(): 描画が行われる「キャンバス」となる画面オブジェクトを作成します。背景色やタイトルなどの設定は、この画面オブジェクトに対して行います。
  • import turtle: turtleモジュールの全ての機能を使うために、これをプログラムの先頭に書きます。

ペンの制御と色の設定:カラフルな星を描く

ペンを上げたり下げたりする機能や、色を細かく設定する例です。

import turtle

screen = turtle.Screen()
screen.bgcolor("black") # 背景を黒に
screen.title("カラフルな星")

star_turtle = turtle.Turtle()
star_turtle.speed(0) # 描画速度を最速に設定(0が最速、1-10は遅い順)
star_turtle.penup() # ペンを上げます(移動しても線を描かない)
star_turtle.goto(-100, 50) # 描画開始位置に移動
star_turtle.pendown() # ペンを下ろします(移動すると線を描く)

colors = ["red", "orange", "yellow", "green", "blue", "purple"] # 使用する色のリスト

for i in range(30): # 30本の星の線を引きます
    star_turtle.pencolor(colors[i % 6]) # リストから色を循環して選択
    star_turtle.forward(i * 10) # 毎回少しずつ長い線を引く
    star_turtle.right(144) # 星の形を作るための角度(360 / 5 * 2 = 144)

turtle.done()

解説

  • star_turtle.right(144): 5角の星を形成するために必要な角度です。正n角形の内角は (n-2) * 180 / n、外角は 360 / n ですが、星形を描く場合は、360 / 辺の数 * 星の尖りの数 で計算されることが多いです(この場合は 360 / 5 * 2 = 144)。
  • star_turtle.forward(i * 10): ループの回数iに応じて、進む距離を長くしています。これにより、内側から外側に向かって広がるような星のパターンが描かれます。
  • star_turtle.pencolor(colors[i % 6]):
    • i % 6 は「モジュロ演算子」で、iを6で割った余りを計算します。これにより、iが0から5の間を循環し、colorsリストの各色を順番に使うことができます。
    • 例: i=0 -> colors[0] (red), i=1 -> colors[1] (orange), ..., i=6 -> colors[0] (red)
  • colors = ["red", "orange", ...]: Pythonのリストを使って複数の色を定義しています。
  • star_turtle.goto(-100, 50): カメを画面上の指定されたX, Y座標に移動させます。画面の中心が(0,0)です。
  • star_turtle.penup() / star_turtle.pendown():
    • penup(): ペンを上げます。この後forward()などで移動しても線は描かれません。
    • pendown(): ペンを下ろします。この後移動すると線が描かれます。 これらのコマンドは、特定の場所へ移動してから描画を開始したり、図形の間を移動する際に使います。
  • star_turtle.speed(0): 描画アニメーションの速度を設定します。0が最も速く、アニメーションをスキップして結果を一瞬で表示します。1から10までの値も指定でき、1が最も遅く、10が速いです。

塗りつぶし機能と円の描画:日章旗(日本の国旗)を描く

begin_fill()end_fill() を使って図形を塗りつぶす例です。

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400) # 画面サイズを600x400ピクセルに設定
screen.bgcolor("white") # 背景色を白に設定
screen.title("日本の国旗")

flag_turtle = turtle.Turtle()
flag_turtle.speed(0) # 描画速度を最速に
flag_turtle.penup() # ペンを上げる

# 赤い丸(日章)を描く
flag_turtle.goto(0, -75) # 円の中心が(0,0)になるように調整 (円の半径は75なのでY座標を-75にする)
flag_turtle.pendown()

flag_turtle.fillcolor("red") # 塗りつぶす色を赤に設定
flag_turtle.begin_fill() # 塗りつぶしを開始
flag_turtle.circle(75) # 半径75ピクセルの円を描く
flag_turtle.end_fill() # 塗りつぶしを終了

flag_turtle.hideturtle() # 描画が終わったカメを非表示にする

turtle.done()

解説

  • flag_turtle.hideturtle(): 描画が完了した後、画面上のカメのアイコンを非表示にします。最終的な絵だけを見せたい場合に便利です。
  • flag_turtle.end_fill(): begin_fill() から end_fill() までの間に描かれた閉じた図形が、fillcolorで指定された色で塗りつぶされます。
  • flag_turtle.circle(75): 半径75ピクセルの円を描きます。
  • flag_turtle.begin_fill(): これを呼び出した時点から、カメが移動して線を描き始めると、その領域が塗りつぶし対象になります。
  • flag_turtle.fillcolor("red"): これから描画する図形を塗りつぶす色を設定します。
  • flag_turtle.goto(0, -75): circle() メソッドは、カメの現在の位置から円を描き始めます。具体的には、カメの現在位置が円の一番下の点になります。そのため、円の中心を(0,0)にするには、カメを(0, -半径)の位置に移動させる必要があります。
  • screen.setup(width=600, height=400): 描画ウィンドウの幅と高さを指定します。

関数を使った複雑な図形:らせん模様

関数を定義して、同じパターンを繰り返すことで複雑な図形を描きます。

import turtle

screen = turtle.Screen()
screen.bgcolor("white")
screen.title("らせん模様")

spiral_turtle = turtle.Turtle()
spiral_turtle.speed(0) # 最速

def draw_spiral(turt, initial_length, angle_increment, num_steps):
    """
    らせん模様を描画する関数

    Args:
        turt (turtle.Turtle): 使用するタートルオブジェクト
        initial_length (int): 最初の線の長さ
        angle_increment (int): 毎回回転する角度の増加量
        num_steps (int): らせんのステップ数
    """
    length = initial_length
    for i in range(num_steps):
        turt.forward(length)
        turt.right(angle_increment)
        length += 5 # 線の長さを少しずつ増やす

draw_spiral(spiral_turtle, 10, 90, 50) # 最初の長さ10、90度ずつ回転、50ステップ

turtle.done()
  • draw_spiral(spiral_turtle, 10, 90, 50): 定義したdraw_spiral関数を呼び出しています。引数に具体的な値を渡すことで、タートルがどのようにらせんを描くかを決定します。
  • length += 5: 毎回ループするごとに、線の長さを5ピクセルずつ増やしています。これにより、らせんが外側に広がっていきます。
  • turt.right(angle_increment): 指定された角度だけ右に回転します。
  • turt.forward(length): 現在の長さだけ前進します。
  • for i in range(num_steps)
    : 指定されたステップ数だけループします。
  • length = initial_length: らせんの最初の線の長さを設定します。
  • def draw_spiral(turt, initial_length, angle_increment, num_steps)
    :
    • これはPythonで関数を定義する方法です。コードを再利用可能にし、プログラムを整理するのに役立ちます。
    • turtinitial_lengthangle_incrementnum_steps は関数の「引数」(パラメータ)です。関数を呼び出すときにこれらの値を渡します。


turtleモジュールと同様に、Pythonで視覚的なプログラミング学習や簡単なグラフィックスを行うための主な代替手段は以下の通りです。

Tkinter (ティキンター)

  • 学習の例
    import tkinter as tk
    
    def button_click():
        label.config(text="ボタンがクリックされました!")
    
    root = tk.Tk() # メインウィンドウを作成
    root.title("Tkinterの例") # ウィンドウのタイトルを設定
    root.geometry("300x200") # ウィンドウのサイズを設定
    
    label = tk.Label(root, text="こんにちは、Tkinter!", font=("Arial", 14))
    label.pack(pady=20) # ラベルを配置
    
    button = tk.Button(root, text="クリックしてね", command=button_click)
    button.pack() # ボタンを配置
    
    root.mainloop() # イベントループを開始(ウィンドウを開いたままにする)
    
    • キャンバス描画の例
      TkinterのCanvasウィジェットを使えば、線、円、四角形などを直接描画できます。これはturtleの描画機能をより低レベルで制御するようなものです。
  • 短所
    • 現代的なGUIフレームワークと比較すると、見た目がやや古く感じられることがあります。
    • 複雑なレイアウトの制御は、他の専門的なGUIフレームワークに比べて少し手間がかかる場合があります。
  • 長所
    • Pythonの標準ライブラリなので、追加のインストールが不要です。
    • ボタン、テキストボックス、ラベル、キャンバスなど、多様なGUIコンポーネントを作成できます。
    • イベント駆動型プログラミング(クリック、キーボード入力などに応じて処理を行う)を学ぶのに適しています。
    • 簡単なゲームやユーティリティツールの作成にも使えます。
  • turtleとの関連性
    turtleグラフィックスが描画されるウィンドウやキャンバスは、実はTkinterのウィジェットです。したがって、Tkinterを直接使うことは、turtleの「舞台裏」を学ぶことに相当します。

Pygame (パイゲーム)

  • 学習の例
    import pygame
    
    # Pygameの初期化
    pygame.init()
    
    # 画面の設定
    screen_width = 800
    screen_height = 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Pygameの例")
    
    # 色の定義
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
        screen.fill(WHITE) # 画面を白で塗りつぶす
    
        # 円を描画 (サーフェス, 色, 中心座標, 半径, 線幅)
        pygame.draw.circle(screen, RED, (screen_width // 2, screen_height // 2), 50)
    
        pygame.display.flip() # 画面を更新
    
    pygame.quit()
    
  • 短所
    • インストールが必要です(pip install pygame)。
    • turtleに比べて学習曲線がやや急になります。ゲームのロジックや描画の概念が複雑になることがあります。
    • 3Dグラフィックスには向いていません。
  • 長所
    • 2Dゲームを迅速に開発できます。
    • 高度なグラフィックス(画像表示、アニメーション)やサウンドを扱えます。
    • キーボードやマウス入力のイベント処理が強力です。
    • ゲーム開発を通じて、プログラミングの様々な概念(オブジェクト指向、ループ、条件分岐、物理演算の基礎など)を実践的に学べます。
  • turtleとの関連性
    turtleが教育用途のシンプルな描画ツールであるのに対し、Pygameはより本格的なグラフィックス描画やインタラクションを目的としています。ピクセルレベルでの描画や、スプライト(キャラクターなどの画像)の管理、衝突判定などが可能です。

Matplotlib (マットプロットリブ)

  • 学習の例
    import matplotlib.pyplot as plt
    import numpy as np
    
    # データを生成
    x = np.linspace(0, 10, 100) # 0から10まで100点のデータ
    y = np.sin(x) # sin波
    
    # グラフの描画
    plt.plot(x, y, label='sin(x)') # 折れ線グラフ
    plt.xlabel('X軸') # X軸ラベル
    plt.ylabel('Y軸') # Y軸ラベル
    plt.title('Matplotlibで描くサイン波') # グラフタイトル
    plt.legend() # 凡例を表示
    plt.grid(True) # グリッドを表示
    plt.show() # グラフを表示
    
  • 短所
    • インストールが必要です(pip install matplotlib)。
    • インタラクティブな描画やアニメーションは可能ですが、リアルタイムのゲームのような描画には向きません。
    • 目的が異なるため、turtleのような「カメさんの動き」による直感的な描画学習とは異なります。
  • 長所
    • 非常に多様な種類のグラフ(折れ線グラフ、棒グラフ、散布図、ヒストグラムなど)を作成できます。
    • データの可視化を通じて、プログラミングとデータサイエンスの両方を学べます。
    • 出版品質の図を作成するのに適しています。
  • turtleとの関連性
    turtleが「絵を描く」ことを目的とするのに対し、Matplotlibは「データを視覚化する」ことを目的とします。描画のスタイルや目的は異なりますが、X-Y座標系で線や点、図形を描画するという点では共通しています。

Kivy (キビー)

  • 短所
    • インストールが必要です(pip install kivy)。
    • 学習曲線はこれまでのライブラリの中で最も急になります。独自の宣言的なUI記述言語(KV Language)を学ぶ必要があります。
  • 長所
    • クロスプラットフォーム開発(iOS/Androidアプリも作成可能)。
    • モダンなGUIを簡単に構築できます。
    • ジェスチャー認識やマルチタッチをサポート。
    • ゲームやインタラクティブなアプリケーションにも向いています。
  • turtleとの関連性
    Kivyはturtleよりもはるかに高度なGUIフレームワークであり、タッチ操作やアニメーションをサポートしたリッチなUIを作成できます。
  • クロスプラットフォーム対応のモダンなGUIアプリを開発したい
    Kivyを検討すると良いでしょう。
  • データ分析結果をグラフで視覚化したい
    Matplotlibが強力です。
  • 2Dゲーム開発やより高度なインタラクティブグラフィックスを学びたい
    Pygameが適しています。
  • PythonでシンプルなデスクトップGUIアプリケーションを作成したい
    Tkinterが手軽で良いでしょう。
  • プログラミング初心者の最初のステップ、視覚的な学習
    turtleが最適です。