Python Turtleでクリエイティブな描画を!pen()の活用例と実践

2025-06-06

具体的には、以下の設定を行うことができます。

  • 下ろす/上げる (pendown/penup): ペンを下ろすか上げるかを設定します。これにより、タートルが移動する際に線を描くか描かないかを制御できます。
  • 速度 (speed): タートルが移動する速度を設定します。
  • サイズ (size): ペンの太さを設定します。
  • 色 (color): ペンの色を設定します。

turtle.pen() は引数なしで呼び出すこともできます。その場合は、現在のペンの設定(色、サイズ、速度など)を含む辞書を返します。

import turtle

# スクリーンとタートルオブジェクトを作成
wn = turtle.Screen()
t = turtle.Turtle()

# ペンの色を赤、太さを5に設定
t.pen(pencolor="red", pensize=5)
t.forward(100) # 赤い線を描く

# ペンを上げて移動(線を描かない)
t.pen(penup=True)
t.forward(50)

# ペンを下ろして色を青に変更
t.pen(pendown=True, pencolor="blue")
t.forward(100) # 青い線を描く

# 現在のペンの設定を取得して表示
current_pen_settings = t.pen()
print(current_pen_settings)

wn.mainloop() # ウィンドウを閉じるまで待機


turtle.pen() に関する一般的なエラーとトラブルシューティング

AttributeError: 'module' object has no attribute 'pen' または 'Turtle' object has no attribute 'pen'

エラーの原因
turtle モジュールを直接 turtle.pen() のように呼び出しているか、または turtle.Turtle() オブジェクトを作成せずに pen() を呼び出そうとしている場合に発生します。pen()turtle.Turtle() オブジェクトのメソッドであり、モジュール自体にはありません。

間違ったコードの例

import turtle
turtle.pen(pencolor="red") # 間違い

または

import turtle
t.pen(pencolor="red") # t が定義されていない

トラブルシューティング
turtle.Turtle() オブジェクトを明示的に作成し、そのオブジェクトに対して pen() メソッドを呼び出す必要があります。

正しいコードの例

import turtle
t = turtle.Turtle() # タートルオブジェクトを作成
t.pen(pencolor="red", pensize=5) # タートルオブジェクトのメソッドを呼び出す
t.forward(100)
turtle.done()

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

エラーの原因
import turtle を忘れているか、タートルオブジェクトを定義する前に使用しようとしている場合に発生します。

間違ったコードの例

# import turtle がない
t = turtle.Turtle()
t.pen(pencolor="red")

トラブルシューティング
コードの最初に import turtle を記述し、タートルオブジェクトを適切に作成しているか確認してください。

正しいコードの例

import turtle # まずモジュールをインポート
t = turtle.Turtle()
t.pen(pencolor="red")
t.forward(100)
turtle.done()

turtle.pen() で設定したはずの変更が反映されない

エラーの原因

  • 引数の指定ミス
    pen() に渡す引数のスペルミスや、期待される値とは異なる値を渡している場合があります(例: 色を文字列ではなく数値で渡そうとする)。
  • reset() や clear() の使用
    turtle.reset()turtle.clear() は、タートルの設定(ペンの設定を含む)を初期状態に戻してしまいます。これらのメソッドを pen() の呼び出し後に実行すると、設定が上書きされます。
  • 異なるタートルオブジェクトに設定している
    複数のタートルオブジェクトを使用している場合、意図しない方のタートルに pen() 設定を行っている可能性があります。

間違ったコードの例

import turtle

# デフォルトタートルのペンサイズを変更
turtle.pensize(10) # 機能的インターフェースを使用

t = turtle.Turtle() # 新しいタートルオブジェクトを作成
t.pen(pencolor="red") # こちらのタートルの色を設定
t.forward(100) # このタートルは赤い線を描く

# しかし、t.pensize(10) とはしていないので、t の太さはデフォルトのままかもしれない
# また、turtle.pensize(10) は t ではなく、スクリーンの「デフォルトタートル」に影響する

turtle.done()
import turtle
t = turtle.Turtle()
t.pen(pencolor="red", pensize=5)
t.reset() # ここでペンの設定がリセットされる
t.forward(100) # デフォルトの設定(黒、細い線)で描かれる
turtle.done()

トラブルシューティング

  • 引数の確認
    pencolor, pensize, pendown, penup, speed などの引数名が正しく、その値も適切か確認してください。色の指定は 'red', 'blue' のような文字列、または (R, G, B) のタプルで行います。
  • reset() や clear() の位置
    pen() で設定を変更した後に reset()clear() を呼び出していないか確認してください。必要であれば、それらの呼び出し後に再度 pen() で設定を行ってください。
  • 対象オブジェクトの確認
    pen() メソッドを呼び出す際に、正しくタートルオブジェクトを指定しているか確認してください。オブジェクト指向プログラミングでは、どのオブジェクトのメソッドを呼び出しているかが重要です。

turtle.pen() に渡せる引数以外のキーワード引数を渡してしまう

エラーの原因
pen() メソッドは、特定のキーワード引数(pencolor, pensize, pendown, penup, speed, fillcolor, resizemode, stretchfactor, outline)のみを受け付けます。それ以外のキーワード引数を渡すと、TypeError が発生する可能性があります。

間違ったコードの例

import turtle
t = turtle.Turtle()
t.pen(line_thickness=5) # line_thickness は無効な引数

トラブルシューティング
turtle.pen() のドキュメントを確認し、使用できるキーワード引数のみを使用するようにしてください。ペンの太さであれば pensize を使用します。

正しいコードの例

import turtle
t = turtle.Turtle()
t.pen(pensize=5) # pensize を使用
t.forward(100)
turtle.done()

turtle.pen() を使わずに個別のメソッドを使いたい場合

turtle.pen() は複数の設定を一括で行うための便利な関数ですが、個々の設定変更には以下の専用メソッドも使えます。

  • turtle.speed(speed)
  • turtle.pendown() / turtle.down()
  • turtle.penup() / turtle.up()
  • turtle.pensize(width)
  • turtle.pencolor(color)

これらのメソッドを使っている場合は、turtle.pen() を使う必要はありません。混同して両方使うと、意図しない挙動になる可能性があります。

  • Pythonファイルの命名規則
    もしturtle.pyという名前で自分のPythonファイルを作成している場合、import turtleとしたときに標準のturtleモジュールではなく、自分の作成したturtle.pyがインポートされてしまい、予期しないエラーが発生することがあります。この場合は、ファイル名をmy_turtle_program.pyのように変更してください。
  • turtle.done() を忘れない
    プログラムの最後に turtle.done() を記述しないと、タートルグラフィックスのウィンドウがすぐに閉じてしまい、描画結果を確認できないことがあります。これはエラーではありませんが、よくある混乱の原因です。
  • 公式ドキュメントを参照する
    Pythonの turtle モジュールの公式ドキュメントは、各関数の詳細な説明と使用例が掲載されており、非常に役立ちます。
  • コードをシンプルにする
    問題が発生した場合、複雑なコードの一部をコメントアウトしたり、最小限のコードで問題が再現するかどうかを試したりすることで、原因を絞り込むことができます。
  • エラーメッセージをよく読む
    Pythonのエラーメッセージは、問題の特定に非常に役立ちます。特に AttributeErrorNameError, TypeError は、上記のどれかに該当する可能性が高いです。


例1:基本的なペンの設定変更

この例では、turtle.pen() を使ってペンの色太さを変更し、線を描画します。

import turtle

# スクリーンとタートルオブジェクトの作成
# 一般的に、タートルオブジェクトは 't' や 'pen' などと名付けられます
screen = turtle.Screen()
my_turtle = turtle.Turtle()

print("初期のペンの設定:", my_turtle.pen()) # デフォルト設定を確認

# --- 最初の線 ---
# ペンを赤色、太さを3ピクセルに設定
my_turtle.pen(pencolor="red", pensize=3)
my_turtle.forward(100) # 前に100ピクセル進む (赤い線が描かれる)

# --- 二番目の線 ---
# ペンを青色、太さを5ピクセルに設定
my_turtle.pen(pencolor="blue", pensize=5)
my_turtle.left(90)     # 左に90度回転
my_turtle.forward(100) # 前に100ピクセル進む (青い線が描かれる)

# --- 三番目の線 ---
# ペンを緑色、太さを1ピクセルに設定
my_turtle.pen(pencolor="green", pensize=1)
my_turtle.left(90)
my_turtle.forward(100)

print("現在のペンの設定:", my_turtle.pen()) # 変更後の設定を確認

# ウィンドウがすぐに閉じないようにする
screen.mainloop()

解説

  • my_turtle.pen() を引数なしで呼び出すと、現在のペンの設定情報が辞書形式で返されます。
  • my_turtle.pen() の呼び出し後に my_turtle.forward() を実行すると、その時点のペンの設定で線が描かれることがわかります。
  • my_turtle.pen(pencolor="red", pensize=3) のように、キーワード引数を使って**pencolor (ペンの色)pensize (ペンの太さ)**を同時に設定しています。

例2:ペンを上げて移動する(線を描かない移動)

この例では、turtle.pen()penup (ペンを上げる) と pendown (ペンを下ろす) 引数を使って、線を描かずに移動する方法を示します。

import turtle

screen = turtle.Screen()
my_turtle = turtle.Turtle()

# --- 最初の線 ---
my_turtle.pen(pencolor="purple", pensize=2)
my_turtle.forward(50) # 紫色の線を描く

# --- 線を描かずに移動 ---
# penup=True でペンを上げる。これにより、タートルが移動しても線が描かれない。
my_turtle.pen(penup=True)
my_turtle.forward(50) # 線を描かずに50ピクセル移動

# --- 再び線を描く ---
# pendown=True でペンを下ろす。再び線が描かれるようになる。
my_turtle.pen(pendown=True, pencolor="orange", pensize=4)
my_turtle.forward(50) # オレンジ色の線を描く

# --- 少し離れた場所に移動して新しい図形を描く ---
my_turtle.pen(penup=True) # ペンを上げる
my_turtle.goto(-100, -100) # 特定の座標に移動 (線は描かれない)
my_turtle.pen(pendown=True, pencolor="brown", pensize=6) # ペンを下ろして設定変更
my_turtle.circle(50) # 茶色の円を描く

screen.mainloop()

解説

  • my_turtle.goto() のような移動メソッドと組み合わせることで、線を描かずに自由にタートルを配置できます。
  • my_turtle.pen(pendown=True) で再びペンを下ろすと、その後の移動で線が描画されるようになります。
  • my_turtle.pen(penup=True) とすることで、タートルが移動しても線が描画されなくなります。これは、描画を中断して別の位置に移動したい場合に非常に便利です。

例3:ペンの速度設定

turtle.pen() を使って描画速度を変更する例です。

import turtle

screen = turtle.Screen()
my_turtle = turtle.Turtle()

# 描画速度のデフォルトは 'normal' または '6' です

# --- 遅い速度で線を描く ---
# speed=1 は最も遅い速度('slowest' も同じ)
my_turtle.pen(pencolor="red", pensize=2, speed=1)
my_turtle.forward(100)

# --- 速い速度で線を描く ---
# speed=0 は最速(アニメーションなし、瞬時に描画)
my_turtle.pen(pencolor="blue", pensize=2, speed=0)
my_turtle.forward(100)

# --- 中間速度で線を描く ---
# speed=6 は通常の速度
my_turtle.pen(pencolor="green", pensize=2, speed=6)
my_turtle.forward(100)

screen.mainloop()

解説

  • 速度を変更することで、複雑な図形を描画する際のプロセスを視覚的に楽しむことができます。
  • speed 引数は、タートルの移動速度を制御します。
    • speed=0: 最速(アニメーションなしで瞬時に移動)
    • speed=1 ('slowest'): 最も遅い
    • speed=10 ('fastest'): 最も速い(0 以外で)
    • speed=6 ('normal'): 通常の速度

turtle.pen() を引数なしで呼び出すと、現在のペンの設定を辞書として取得できます。この情報を使って、設定を一時的に保存したり、特定のプロパティだけを変更したりすることができます。

import turtle

screen = turtle.Screen()
my_turtle = turtle.Turtle()

# 初期設定で描画
my_turtle.pen(pencolor="black", pensize=5, speed=5)
my_turtle.forward(50)

# 現在のペンの設定を保存
# この辞書には、ペンの色、太さ、速度、ペンが上がっているかなどの情報が含まれる
current_settings = my_turtle.pen()
print("保存された設定:", current_settings)

# --- 一時的に設定を変更して描画 ---
my_turtle.pen(pencolor="gray", pensize=1, pendown=False) # ペンを上げて細い灰色のペンに
my_turtle.goto(0, -50) # 線を描かずに移動
my_turtle.pen(pendown=True) # ペンを下ろす
my_turtle.circle(30) # 灰色の細い円を描く

# --- 保存した設定に戻す ---
# 辞書を展開して、元の設定を再適用
my_turtle.pen(**current_settings) # ** を使うことで辞書のキーと値を引数として渡せる
my_turtle.forward(50) # 太い黒い線が再び描かれる

screen.mainloop()
  • my_turtle.pen(**current_settings) のように、辞書の前に ** をつけることで、辞書のキーと値をそれぞれ引数として pen() に渡すことができます。これにより、以前の状態に簡単に戻すことが可能です。
  • current_settings = my_turtle.pen() は、タートルの現在のペン設定を辞書形式で取得します。


turtle.pen() の代替メソッド

turtle.pen() が複数の設定を一度に行うのに対し、以下のメソッドはそれぞれの設定を個別に変更します。

  1. turtle.pencolor(color):

    • 用途
      ペンの色を設定します。
    • 引数
      色の名前(例: "red", "blue")またはRGB値のタプル(例: (0.5, 0.2, 0.8))。
    • turtle.pen() での代替
      pencolor="red"

    • import turtle
      t = turtle.Turtle()
      t.pencolor("purple") # ペンの色を紫に設定
      t.forward(100)
      turtle.done()
      
  2. turtle.pensize(width):

    • 用途
      ペンの太さ(幅)を設定します。
    • 引数
      幅を表す数値(ピクセル単位)。
    • turtle.pen() での代替
      pensize=5

    • import turtle
      t = turtle.Turtle()
      t.pensize(5) # ペンの太さを5ピクセルに設定
      t.forward(100)
      turtle.done()
      
  3. turtle.penup() / turtle.up():

    • 用途
      ペンを上げます。タートルが移動しても線が描画されなくなります。
    • 引数
      なし。
    • turtle.pen() での代替
      penup=True

    • import turtle
      t = turtle.Turtle()
      t.forward(50) # 線を描く
      t.penup()     # ペンを上げる
      t.forward(50) # 線を描かずに移動
      t.pendown()   # ペンを下ろす
      t.forward(50) # 再び線を描く
      turtle.done()
      
  4. turtle.pendown() / turtle.down():

    • 用途
      ペンを下ろします。タートルが移動すると線が描画されるようになります。
    • 引数
      なし。
    • turtle.pen() での代替
      pendown=True

    • (上記の penup() の例と組み合わせるのが一般的です)
      import turtle
      t = turtle.Turtle()
      t.penup()     # 最初からペンを上げておく
      t.goto(-100, 0) # 線を描かずに左へ移動
      t.pendown()   # ペンを下ろす
      t.pencolor("green")
      t.circle(50)  # 緑の円を描く
      turtle.done()
      
  5. turtle.speed(speed):

    • 用途
      タートルのアニメーション速度を設定します。
    • 引数
      0(最速、アニメーションなし)、または1( slowest)から10(fastest)までの整数、または文字列("fastest", "fast", "normal", "slow", "slowest")。
    • turtle.pen() での代替
      speed=0

    • import turtle
      t = turtle.Turtle()
      t.speed(0) # 最速で描画(アニメーションなし)
      for _ in range(36):
          t.forward(100)
          t.right(170)
      turtle.done()
      
  • 個別のメソッドを使う場合

    • 特定のペンの属性のみを変更したい場合。例えば、色だけを変えたい、太さだけを変えたい、といった場合。
    • コードの可読性を高めたい場合(それぞれのメソッドが何をしているか明確なので)。
    • penup()pendown() のように、引数なしで状態を切り替えるメソッドを使用したい場合。

多くの場合、どちらの方法を使っても最終的な結果は同じになります。プロジェクトの規模、個人のコーディングスタイル、コードの明確性を重視するかどうかによって選択すると良いでしょう。