turtle.pencolor()

2025-06-06

Pythonの`turtle`モジュールにおける`turtle.pencolor()`は、描画を行うペンの色を設定したり、現在のペンの色を取得したりするために使われる関数です。

**1. ペンの色を設定する**

`turtle.pencolor()`に引数として色を渡すことで、ペンの色を設定できます。色の指定方法にはいくつかあります。

* **色名(文字列):**
    最も一般的な方法で、英語の色名を文字列で指定します。
    例: `"red"`, `"blue"`, `"green"`, `"black"`, `"white"`, `"purple"`, `"orange"` など

    ```python
    import turtle

    # タートルグラフィックスの画面とタートルを作成
    screen = turtle.Screen()
    t = turtle.Turtle()

    # ペンの色を赤に設定して四角形を描画
    t.pencolor("red")
    for _ in range(4):
        t.forward(100)
        t.right(90)

    # ペンの色を青に設定して円を描画
    t.penup()  # ペンを上げて移動
    t.goto(-150, 0)
    t.pendown() # ペンを下ろして描画開始
    t.pencolor("blue")
    t.circle(50)

    screen.mainloop()
    ```

* **RGB値(タプル):**
    赤(Red)、緑(Green)、青(Blue)の各色の成分を0から255の範囲で指定するタプル形式です。`screen.colormode(255)`を設定しておく必要があります。

    ```python
    import turtle

    screen = turtle.Screen()
    screen.colormode(255) # カラーモードをRGB値 (0-255) に設定
    t = turtle.Turtle()

    # ペンの色を明るい緑 (RGB) に設定
    t.pencolor((0, 200, 50))
    t.forward(100)

    screen.mainloop()
    ```

* **RGB値(16進数文字列):**
    HTMLなどでおなじみの16進数形式のRGB値(例: `"#RRGGBB"`)でも指定できます。

    ```python
    import turtle

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

    # ペンの色をティール (16進数) に設定
    t.pencolor("#008080")
    t.circle(70)

    screen.mainloop()
    ```

**2. 現在のペンの色を取得する**

`turtle.pencolor()`を引数なしで呼び出すと、現在設定されているペンの色を返します。返される値は、カラーモードによって異なります。

* `screen.colormode(1.0)`(デフォルト)の場合:`(r, g, b)`の形式のタプルで、各成分は0.0から1.0の浮動小数点数です。
* `screen.colormode(255)`の場合:`(r, g, b)`の形式のタプルで、各成分は0から255の整数です。

```python
import turtle

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

# デフォルトのペンの色を取得
current_color = t.pencolor()
print(f"現在のペンの色 (デフォルト): {current_color}") # 例: (0.0, 0.0, 0.0) (黒)

t.pencolor("orange")
new_color = t.pencolor()
print(f"新しいペンの色: {new_color}") # 例: "orange" または (1.0, 0.6470588235294118, 0.0)

screen.mainloop()


turtle.pencolor()は非常に直感的な関数ですが、いくつか一般的な落とし穴があります。

エラーメッセージ: TypeError: pencolor() missing 1 required positional argument: 'color'

原因
pencolor()を引数なしで呼び出したにもかかわらず、現在のカラーモードがRGB値(タプル)を返さない設定になっている場合や、色を設定しようとしているにもかかわらず引数を渡し忘れた場合に発生します。


import turtle
t = turtle.Turtle()
t.pencolor() # 色を取得したいが、引数なしで呼び出した

トラブルシューティング

  • 現在の色を取得したい場合
    基本的には引数なしで呼び出せば取得できますが、上記のエラーが出る場合は、screen.colormode()の設定が関連している可能性があります。通常はデフォルトのカラーモード(1.0)であればこのエラーは出ません。
  • 色を設定したい場合
    設定したい色の引数(文字列の色名、RGBタプル、16進数文字列)を渡してください。
    t.pencolor("red")
    t.pencolor((255, 0, 0)) # screen.colormode(255) の場合
    t.pencolor("#FF0000")
    

エラーメッセージ: KeyError: 'invalid color string' または TypeError: bad color sequence

原因
pencolor()に無効な色の指定方法をした場合に発生します。

  • 不正な16進数文字列
    "#RRGGBB"の形式ではない、無効な文字が含まれている。
  • 不正なRGBタプル
    RGBの範囲(0-255または0.0-1.0)を超えている、タプルの要素数が間違っている(3つではない)、数値以外のものが含まれている。
  • 無効な色名
    存在しない色名(例: "reud"、"bluee")


import turtle
t = turtle.Turtle()
t.pencolor("bluue") # 無効な色名
t.pencolor((300, 0, 0)) # RGB値が範囲外 (0-255の場合)
t.pencolor((0.5, 1.2, 0.3)) # RGB値が範囲外 (0.0-1.0の場合)
t.pencolor((255, 0)) # 要素数が足りない
t.pencolor("#GG0000") # 無効な16進数文字

トラブルシューティング

  • 16進数文字列の場合
    "#"で始まり、その後に続く6文字が有効な16進数(0-9, A-F, a-f)であるか確認してください。
  • RGBタプルの場合
    • screen.colormode()が正しく設定されているか確認してください。デフォルトは1.0(0.0-1.0の浮動小数点数)で、screen.colormode(255)に設定すると0-255の整数で指定できます。
    • 各RGB成分が適切な範囲(0-255または0.0-1.0)内にあるか確認してください。
    • タプルが3つの要素(赤、緑、青)で構成されているか確認してください。

設定したはずの色が反映されない

原因
これはエラーメッセージとして表示されるものではありませんが、よくあるトラブルです。

  • ペンが上がっている状態 (penup())
    ペンが上がっている間は、いくらpencolor()を設定しても線は描かれないため、色の変化も確認できません。
  • 色の変化が分かりにくい色を指定している
    非常に暗い色から別の暗い色に変更しても、見た目の変化が少ないことがあります。
  • screen.colormode()の設定と色の指定方法が合っていない
    • screen.colormode(1.0)(デフォルト)なのにpencolor((255, 0, 0))のように0-255の整数で指定している。この場合、色が正しく解釈されず、予期せぬ色(黒など)になることがあります。
    • screen.colormode(255)なのにpencolor((0.5, 0.0, 0.0))のように0.0-1.0の浮動小数点数で指定している。
  • 描画前に色を変更していない
    色を変更しても、すでに描かれた図形の色は変わりません。色を変えた後の描画から新しい色が適用されます。

トラブルシューティング

  • ペンの状態の確認
    t.pendown()でペンが下がっていることを確認してください。
  • 色の視認性の確認
    設定した色が視覚的に変化がわかりやすい色(例: 赤、青、緑など)でテストしてみてください。
  • screen.colormode()の確認
    • 0-255のRGB値を使いたい場合は、必ずscreen.colormode(255)を呼び出してください。
    • 0.0-1.0の浮動小数点数のRGB値を使いたい場合は、screen.colormode(1.0)(デフォルト)のままでOKです。 <!-- end list -->
    import turtle
    screen = turtle.Screen()
    t = turtle.Turtle()
    
    # 0-255のRGB値を使いたい場合
    screen.colormode(255)
    t.pencolor((100, 200, 50)) # 例: 緑がかった色
    
    # 0.0-1.0のRGB値を使いたい場合
    screen.colormode(1.0) # デフォルトに戻すか、明示的に設定
    t.pencolor((0.4, 0.8, 0.2)) # 上記と同じ緑がかった色
    
  • 色の変更タイミングの確認
    色を変更したい描画の直前t.pencolor()を呼び出してください。
    import turtle
    t = turtle.Turtle()
    
    t.pencolor("red") # 赤で描画
    t.forward(50)
    
    t.pencolor("blue") # 青で描画
    t.forward(50)
    
    turtle.done()
    

turtle.Turtle()オブジェクトを作成していない

原因
pencolor()は特定のタートルオブジェクトのメソッドです。turtleモジュールそのものではなく、作成したタートルインスタンスに対して呼び出す必要があります。


import turtle
# turtle.pencolor("red") # エラー: 'module' object has no attribute 'pencolor'

トラブルシューティング
turtle.Turtle()を呼び出してタートルオブジェクトを作成し、そのオブジェクトに対してpencolor()を呼び出してください。

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


turtle.pencolor()は、タートルグラフィックスで描画する線の色を制御するために使われます。ここでは、様々な使い方を示すコード例をいくつか紹介します。

例1: 基本的な色の設定(色名を使用)

最も一般的な方法で、英語の色名を文字列で指定します。

import turtle

# 画面とタートルオブジェクトの準備
screen = turtle.Screen() # 描画する画面
t = turtle.Turtle()     # 描画するタートル(ペン)

# ペンの色を赤に設定して四角形を描画
t.pencolor("red")
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)

# ペンを上げて移動し、新しい場所から青で円を描画
t.penup()  # ペンを上げる(描画しない)
t.goto(-150, 50) # 指定した座標へ移動
t.pendown() # ペンを下ろす(描画を開始する)

t.pencolor("blue") # ペンの色を青に設定
t.circle(70) # 半径70の円を描画

# プログラムがすぐに閉じないようにする
screen.mainloop()
# または turtle.done() でもOKですが、screen.mainloop()がより一般的です

説明

  • t.pendown()でペンを下ろした後、t.pencolor("blue")で色を青に変更し、青い線で円が描かれます。
  • 次にt.penup()でペンを上げ、t.goto()で別の位置に移動します。
  • 最初の四角形はt.pencolor("red")によって赤い線で描かれます。

例2: RGB値を使った色の設定

RGB値(赤、緑、青の光の三原色)で色を指定する方法です。0から255の整数値で指定する場合は、事前にscreen.colormode(255)を設定する必要があります。

import turtle

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

# カラーモードをRGB値 (0-255) に設定
screen.colormode(255)

# ペンの色を明るい緑 (RGB: R=0, G=200, B=50) に設定
t.pencolor((0, 200, 50))
t.pensize(5) # ペンの太さを5に設定
t.forward(100)

# ペンの色を紫色 (RGB: R=150, G=0, B=255) に設定
t.pencolor((150, 0, 255))
t.backward(50) # 後ろへ移動
t.right(90)
t.forward(50)

screen.mainloop()

説明

  • t.pencolor((0, 200, 50))は緑がかった色を、t.pencolor((150, 0, 255))は紫色を設定しています。
  • screen.colormode(255)を呼び出すことで、RGB値を0〜255の範囲で指定できるようになります。

例3: 16進数文字列を使った色の設定

ウェブデザインなどでよく使われる16進数形式のRGB値(例: "#RRGGBB")でも色を指定できます。

import turtle

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

# ペンの色をティール (Teal: #008080) に設定
t.pencolor("#008080")
t.circle(60) # 半径60の円を描画

t.penup()
t.goto(100, 0)
t.pendown()

# ペンの色をゴールド (Gold: #FFD700) に設定
t.pencolor("#FFD700")
t.right(90)
t.forward(100)

screen.mainloop()

説明

  • 16進数カラーコードは、#の後に6桁の16進数(0-9, A-F)が続きます。
  • t.pencolor("#008080")はティール色を、t.pencolor("#FFD700")は金色を設定しています。

例4: 現在のペンの色を取得する

turtle.pencolor()を引数なしで呼び出すと、現在設定されているペンの色を取得できます。

import turtle

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

# デフォルトのペンの色を取得して表示
# デフォルトは黒で、(0.0, 0.0, 0.0) または "black" が返る場合があります。
current_color = t.pencolor()
print(f"初期のペンの色: {current_color}")

# 色を赤に設定
t.pencolor("red")
t.forward(50)

# 変更後のペンの色を取得して表示
changed_color = t.pencolor()
print(f"変更後のペンの色: {changed_color}")

# RGBモードに切り替えて、再度色を設定・取得
screen.colormode(255)
t.pencolor((0, 100, 200)) # 青みがかった色に設定
rgb_color = t.pencolor()
print(f"RGBモードでのペンの色: {rgb_color}")

screen.mainloop()

実行結果の例

初期のペンの色: black
変更後のペンの色: red
RGBモードでのペンの色: (0, 100, 200)

説明

  • screen.colormode(255)に変更すると、RGB値のタプルで色が返されるようになります。
  • t.pencolor("red")で色を変更した後、再度t.pencolor()を呼び出すと"red"が返されます。
  • 初期状態ではt.pencolor()はデフォルトの黒を返します。

例5: ランダムな色で線を描く

randomモジュールと組み合わせて、描画するたびにペンの色をランダムに変える例です。

import turtle
import random

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

# RGBモードを255に設定 (ランダムなRGB値を生成するため)
screen.colormode(255)
t.speed(0) # 描画速度を最速に設定

for _ in range(20): # 20回繰り返す
    # ランダムなRGB値を生成
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)

    t.pencolor((r, g, b)) # 生成した色を設定
    t.forward(random.randint(50, 150)) # ランダムな長さで前進
    t.right(random.randint(90, 180)) # ランダムな角度で右回転

screen.mainloop()
  • これにより、線が描かれるたびに異なる色になり、カラフルな模様が生成されます。
  • random.randint(0, 255)を使って、0から255までのランダムな整数を生成し、それをRGB値としてt.pencolor()に渡しています。


turtle.pencolor()はペンの色を設定する主要な方法ですが、関連する他のメソッドや、別の視点から色の設定を考える方法もあります。

turtle.color() メソッド

turtle.color()は、ペンの色(pencolor)と塗りつぶしの色(fillcolor)を同時に設定する際に非常に便利です。引数の与え方によって挙動が変わります。

  • 2つの色名/RGB値/16進数文字列を渡す場合
    最初の引数がペンの色、2番目の引数が塗りつぶしの色になります。

    import turtle
    
    screen = turtle.Screen()
    t = turtle.Turtle()
    
    # ペンを赤、塗りつぶしを青に設定
    t.color("red", "blue")
    t.begin_fill()
    t.circle(50)
    t.end_fill()
    
    t.penup()
    t.goto(100, 0)
    t.pendown()
    
    # ペンを緑、塗りつぶしを黄色に設定
    screen.colormode(255)
    t.color((0, 255, 0), (255, 255, 0)) # (緑, 黄色)
    t.begin_fill()
    for _ in range(4):
        t.forward(80)
        t.right(90)
    t.end_fill()
    
    screen.mainloop()
    

    pencolor()との比較
    pencolor()は線の色のみを設定するのに対し、color()は線の色と塗りつぶしの色の両方を一度に、あるいは個別に設定できるため、塗りつぶしを伴う図形を描く際に便利です。

  • 単一の色名/RGB値/16進数文字列を渡す場合
    ペンの色と塗りつぶしの色の両方をその色に設定します。

    import turtle
    
    screen = turtle.Screen()
    t = turtle.Turtle()
    
    t.color("green") # pencolorとfillcolorの両方を"green"に設定
    t.begin_fill()   # 塗りつぶしの開始
    t.circle(50)
    t.end_fill()     # 塗りつぶしの終了
    
    t.penup()
    t.goto(-100, 0)
    t.pendown()
    
    screen.colormode(255)
    t.color((200, 50, 0)) # pencolorとfillcolorの両方を指定したRGB値に設定
    t.begin_fill()
    for _ in range(3):
        t.forward(100)
        t.left(120)
    t.end_fill()
    
    screen.mainloop()
    

turtle.fillcolor() メソッド

fillcolor()は、pencolor()が線の色を設定するのと同じように、塗りつぶしの色のみを設定します。通常、begin_fill()end_fill()の間に描かれた図形の内側がこの色で塗りつぶされます。

import turtle

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

t.pencolor("black") # 線は黒
t.fillcolor("orange") # 塗りつぶしはオレンジ

t.begin_fill() # 塗りつぶし開始
t.circle(70)
t.end_fill()   # 塗りつぶし終了

t.penup()
t.goto(-150, 0)
t.pendown()

t.pencolor("blue") # 線は青
t.fillcolor("purple") # 塗りつぶしは紫

t.begin_fill()
for _ in range(3): # 三角形
    t.forward(100)
    t.left(120)
t.end_fill()

screen.mainloop()

pencolor()との比較
pencolor()が線の色のみを対象とするのに対し、fillcolor()は塗りつぶしの色のみを対象とします。両方を個別に制御したい場合に組み合わせて使用します。

turtle.Turtle() コンストラクタで初期色を指定

タートルオブジェクトを作成する際に、pencolorfillcolor、あるいはcolorを指定して、初期の色を設定することができます。

import turtle

screen = turtle.Screen()

# 初期ペンの色を赤に設定してタートルを作成
t1 = turtle.Turtle(pencolor="red")
t1.forward(100)

# 初期塗りつぶし色を緑に設定してタートルを作成
t2 = turtle.Turtle(fillcolor="green")
t2.penup()
t2.goto(-100, 50)
t2.pendown()
t2.begin_fill()
t2.circle(30)
t2.end_fill()

# ペンを青、塗りつぶしを黄色に設定してタートルを作成
t3 = turtle.Turtle(color="blue", fillcolor="yellow")
t3.penup()
t3.goto(50, -50)
t3.pendown()
t3.begin_fill()
for _ in range(4):
    t3.forward(60)
    t3.right(90)
t3.end_fill()

screen.mainloop()

pencolor()との比較
pencolor()が描画の途中で色を変更するのに使うのに対し、コンストラクタでの指定は、そのタートルが最初に持つ色を設定するものです。途中で変更する場合は、やはりpencolor()(またはcolor(), fillcolor())を使用します。

turtle.Screen()のカラーモード設定 (screen.colormode())

これは直接色を設定するメソッドではありませんが、pencolor()や他の色設定メソッドでRGB値を指定する際の代替的な数値表現を可能にする重要な設定です。

  • screen.colormode(255)
    RGB値を0から255の整数で指定します。より直感的で、多くのグラフィックツールで使われる形式です。 例: t.pencolor((255, 0, 0)) (赤)

  • screen.colormode(1.0) (デフォルト)
    RGB値を0.0から1.0の浮動小数点数で指定します。 例: t.pencolor((1.0, 0.0, 0.0)) (赤)

import turtle

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

# デフォルト (1.0) モードでの色指定
screen.colormode(1.0)
t.pencolor((0.8, 0.5, 0.1)) # 茶色がかった色
t.forward(50)

# 255 モードでの色指定
screen.colormode(255)
t.pencolor((128, 0, 128)) # 紫色
t.backward(50)

screen.mainloop()

pencolor()との関連
colormode()pencolor()が色の引数をどのように解釈するかを定義するため、pencolor()を使う上で重要な設定です。特にRGB値で色を細かく指定したい場合に、どちらのモードで指定するかを意識する必要があります。

turtle.pencolor()は線の色を設定する最も直接的な方法ですが、以下の代替・関連メソッドを理解することで、より柔軟にタートルグラフィックスの色彩を制御できます。

  • screen.colormode(): RGB値の指定方法(0-1または0-255)を切り替えたい場合。
  • turtle.Turtle()コンストラクタ: タートル作成時に初期色を設定したい場合。
  • turtle.fillcolor(): 塗りつぶしの色だけを設定したい場合。
  • turtle.color(): 線と塗りつぶしの両方を同時に設定したい場合。