turtle.fillcolor()

2025-06-06

turtle.fillcolor() は、Pythonの turtle グラフィックモジュールにおいて、図形を塗りつぶす際の色を設定するための関数です。この関数を使うことで、タートルが描画する閉じた図形(例えば、円、四角形、多角形など)の内部を特定の色で塗りつぶすことができます。

使い方

turtle.fillcolor() には、色の名前(文字列)またはRGB値のタプル((R, G, B))を引数として渡します。

色の名前で指定する場合

import turtle

t = turtle.Turtle()
t.fillcolor("red") # 塗りつぶしの色を赤に設定

よく使われる色の名前としては、"red", "blue", "green", "black", "white", "yellow", "orange", "purple", "brown", "pink", "gray" などがあります。

RGB値で指定する場合

RGB値は、それぞれ赤、緑、青の光の強度を0から255までの整数で表現します。

import turtle

t = turtle.Turtle()
t.fillcolor(0, 255, 0) # 塗りつぶしの色を緑に設定 (R=0, G=255, B=0)

または、turtle.colormode(255) を設定している場合は、以下のように指定できます。

import turtle

turtle.colormode(255) # カラーモードを255に設定(デフォルトは1.0)
t = turtle.Turtle()
t.fillcolor((0, 255, 0)) # 塗りつぶしの色を緑に設定

引数なしで呼び出す場合

turtle.fillcolor() を引数なしで呼び出すと、現在設定されている塗りつぶし色を返します。

import turtle

t = turtle.Turtle()
t.fillcolor("blue")
current_color = t.fillcolor()
print(f"現在の塗りつぶし色: {current_color}") # 出力例: 現在の塗りつぶし色: blue

図形を塗りつぶす際の注意点

turtle.fillcolor() で色を設定しただけでは、図形は塗りつぶされません。図形を塗りつぶすためには、以下の2つの関数と組み合わせて使用する必要があります。

  • turtle.end_fill(): 塗りつぶしを終了することをタートルに伝えます。
  • turtle.begin_fill(): 塗りつぶしを開始することをタートルに伝えます。この関数が呼び出された後から turtle.end_fill() が呼び出されるまでの間に描かれた閉じた図形が、fillcolor() で設定された色で塗りつぶされます。

使用例

import turtle

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

# 塗りつぶし色の設定
t.fillcolor("lightblue") # 水色に設定

# 塗りつぶしを開始
t.begin_fill()

# 四角形を描画
for _ in range(4):
    t.forward(100)
    t.right(90)

# 塗りつぶしを終了(ここで四角形が塗りつぶされる)
t.end_fill()

# 別の図形(円)を塗りつぶす例
t.penup() # ペンを上げる
t.goto(-150, 0) # 位置を移動
t.pendown() # ペンを下ろす

t.fillcolor("lightgreen") # 薄い緑色に設定
t.begin_fill()
t.circle(50) # 半径50の円を描画
t.end_fill()

# ウィンドウが閉じないようにする
turtle.done()

この例では、まず水色の四角形が、次に薄い緑色の円が描画され、それぞれ指定された色で塗りつぶされます。



turtle.fillcolor()自体は色の設定を行う関数であり、単独でエラーが発生することは比較的少ないですが、図形を塗りつぶすための他の関数(begin_fill(), end_fill())との組み合わせ方や、色の指定方法によって問題が発生することがあります。

図形が塗りつぶされない(最も多いケース)

これが最もよく遭遇する問題です。fillcolor()を設定したのに、描画した図形が塗りつぶされないという状況です。

原因

  • 図形が閉じていない
    turtleは、begin_fill()end_fill()の間に描かれた「閉じた図形」を塗りつぶします。ペンが途中で上がったり(penup())、図形が完全に閉じずに描画が終了したりすると、うまく塗りつぶされません。
  • begin_fill() と end_fill() の位置が不適切
    塗りつぶしたい図形の描画コードが、begin_fill()end_fill() の間に含まれていない。特にループ内で塗りつぶしを試みる際に、begin_fill()/end_fill()がループの内側に入ってしまい、意図しない小さな領域が塗りつぶされたり、全く塗りつぶされなかったりすることがあります。
  • begin_fill() と end_fill() の呼び忘れ
    fillcolor() は塗りつぶす色を設定するだけで、実際に塗りつぶしを開始・終了する指示がありません。

対処法

  • 図形が閉じているか確認する
    描画の開始点と終了点が一致しているか、または線が途切れていないか確認します。goto()などでペンを上げて移動している場合、その間は線が描かれないため、塗りつぶしがうまくいかないことがあります。
  • begin_fill()とend_fill()の位置を確認する
    意図した図形全体がbegin_fill()end_fill()のブロックに含まれているか確認します。
    import turtle
    
    t = turtle.Turtle()
    t.fillcolor("green")
    
    # NG例:ループの中でbegin_fill/end_fillすると、細切れの線が塗りつぶされる
    # for _ in range(4):
    #     t.begin_fill()
    #     t.forward(100)
    #     t.right(90)
    #     t.end_fill()
    
    # OK例:ループの外側でbegin_fill/end_fillする
    t.begin_fill()
    for _ in range(4):
        t.forward(100)
        t.right(90)
    t.end_fill()
    
    turtle.done()
    
  • begin_fill()とend_fill()を必ず使用する
    塗りつぶしたい図形を描画するコードの前にt.begin_fill()を、描画が終わった後にt.end_fill()を配置します。
    import turtle
    
    t = turtle.Turtle()
    t.fillcolor("blue") # 色を設定
    
    t.begin_fill() # 塗りつぶし開始
    t.circle(50)   # 円を描画(閉じた図形)
    t.end_fill()   # 塗りつぶし終了
    
    turtle.done()
    

色の指定が間違っている

原因

  • colormodeの設定忘れ
    RGB値を0〜1.0の浮動小数点数で指定したいのに、turtle.colormode(255)をデフォルトのままにしている場合。
  • RGB値の範囲外の指定
    RGB値は通常0〜255の範囲で指定しますが、誤ってそれ以外の値を指定している場合。
  • 存在しない色の名前を使用
    "light_blue" のようにアンダースコアを使ったり、スペルミスがあったりすると、認識されません。

対処法

  • colormodeを適切に設定する

    • 0〜255で指定したい場合: turtle.colormode(255)をプログラムの先頭で呼び出します。
    • 0〜1.0で指定したい場合: turtle.colormode(1.0)(デフォルト)のままで、t.fillcolor(0.5, 0.2, 0.8)のように浮動小数点数で指定します。
    import turtle
    
    t = turtle.Turtle()
    
    # 例1: 色の名前で指定
    t.fillcolor("purple")
    t.begin_fill()
    t.circle(30)
    t.end_fill()
    
    # 例2: RGB (0-255) で指定
    turtle.colormode(255) # これを忘れるとエラーになるか、意図しない色になる
    t.penup()
    t.goto(100, 0)
    t.pendown()
    t.fillcolor(255, 165, 0) # オレンジ
    t.begin_fill()
    t.circle(30)
    t.end_fill()
    
    turtle.done()
    
  • RGB値の範囲を確認する
    t.fillcolor(R, G, B)で指定する場合、R, G, Bが0〜255の整数であることを確認します。

  • 標準的な色の名前を使用する
    "red", "blue", "green", "yellow", "orange", "purple", "brown", "black", "white", "gray", "lightgreen", "lightblue" など、一般的な色の名前を使用します。

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

原因

  • turtleオブジェクトを正しく作成していないか、別の変数名を使っているのにturtle.fillcolor()を直接呼び出している。

対処法

  • t = turtle.Turtle()のようにタートルオブジェクトを作成し、そのオブジェクトに対してメソッドを呼び出すようにします。
    import turtle
    
    # OK例
    my_turtle = turtle.Turtle()
    my_turtle.fillcolor("pink")
    my_turtle.begin_fill()
    my_turtle.forward(50)
    my_turtle.right(90)
    my_turtle.forward(50)
    my_turtle.end_fill()
    
    # NG例 (直接turtleモジュールから呼び出している)
    # turtle.fillcolor("red") # これはエラーになる
    
    turtle.done()
    

TypeError: fillcolor() missing 1 required positional argument: 'color'

原因

  • turtle.fillcolor()を引数なしで呼び出している場合、現在の塗りつぶし色を取得する動作になりますが、色の設定を意図しているにもかかわらず引数を渡し忘れている。

対処法

  • 色の名前またはRGB値を引数として渡します。
    import turtle
    
    t = turtle.Turtle()
    
    # OK例
    t.fillcolor("yellow")
    
    # NG例 (引数なしで設定しようとしている)
    # t.fillcolor() # これだとTypeErrorになる
    
    print(t.fillcolor()) # 現在の色を取得する場合はOK
    t.begin_fill()
    t.circle(40)
    t.end_fill()
    
    turtle.done()
    


単純な四角形を塗りつぶす

最も基本的な例です。fillcolor()で色を設定し、begin_fill()end_fill()で囲まれた範囲の図形が塗りつぶされます。

import turtle

# タートルオブジェクトの作成
t = turtle.Turtle()
t.speed(1) # 描画速度(1から10、0が最速)

# 塗りつぶしの色を設定(色の名前で指定)
t.fillcolor("skyblue")

# 塗りつぶしを開始
t.begin_fill()

# 四角形を描画
for _ in range(4):
    t.forward(100)
    t.right(90)

# 塗りつぶしを終了
t.end_fill()

# 描画ウィンドウを閉じるまで待機
turtle.done()

解説

  1. import turtleturtle モジュールをインポートします。
  2. t = turtle.Turtle() でタートルオブジェクトを作成します。
  3. t.fillcolor("skyblue") で塗りつぶしの色を「水色」に設定します。
  4. t.begin_fill() を呼び出すと、これ以降の描画が塗りつぶしの対象になります。
  5. for _ in range(4): ... で100ピクセルの四角形を描画します。
  6. t.end_fill() を呼び出すと、begin_fill()からend_fill()までの間に描かれた閉じた図形がfillcolor()で設定された色で塗りつぶされます。

RGB値で色を指定して円を塗りつぶす

色の名前だけでなく、RGB値(赤、緑、青の成分)を使って色を指定することもできます。

import turtle

t = turtle.Turtle()
t.speed(1)

# カラーモードを255に設定(デフォルトは0.0~1.0)
# これにより、RGB値を0~255の範囲で指定できるようになります
turtle.colormode(255)

# 塗りつぶしの色を設定(RGB値で指定 - 緑色)
t.fillcolor(0, 200, 0) # R=0, G=200, B=0

t.begin_fill()
t.circle(70) # 半径70の円を描画
t.end_fill()

turtle.done()

解説

  1. turtle.colormode(255) を設定することで、RGB値を0から255までの整数で指定できるようになります。この設定がない場合、RGB値は0.0から1.0までの浮動小数点数で指定する必要があります。
  2. t.fillcolor(0, 200, 0) で少し暗めの緑色を設定しています。

複数の図形を異なる色で塗りつぶす

fillcolor()begin_fill()end_fill() のセットを繰り返すことで、複数の図形を異なる色で塗りつぶすことができます。

import turtle

t = turtle.Turtle()
t.speed(2)

# ----- 1つ目の図形: 赤い三角形 -----
t.fillcolor("red")
t.begin_fill()
for _ in range(3):
    t.forward(100)
    t.left(120) # 正三角形の角度
t.end_fill()

# ----- 2つ目の図形: 青い円 -----
t.penup() # ペンを上げて移動
t.goto(150, 0)
t.pendown() # ペンを下ろす

t.fillcolor("blue")
t.begin_fill()
t.circle(60)
t.end_fill()

# ----- 3つ目の図形: 緑の星形 -----
t.penup()
t.goto(-100, -150)
t.pendown()

t.fillcolor("green")
t.begin_fill()
for _ in range(5): # 5点星を描画
    t.forward(150)
    t.right(144)
t.end_fill()

turtle.done()

解説

  • 図形の間を移動する際に t.penup()t.pendown() を使って、線を描かずに移動しています。
  • 各図形を塗りつぶす前に t.fillcolor() で色を設定し、その図形の描画を t.begin_fill()t.end_fill() で囲んでいます。

color() メソッドを使うと、線の色と塗りつぶしの色を同時に設定できます。fillcolor() は塗りつぶし色のみを設定します。

import turtle

t = turtle.Turtle()
t.speed(2)

# 線の色を黒、塗りつぶし色を黄色に設定
t.color("black", "yellow") # 最初の引数が線の色、2番目が塗りつぶし色

t.pensize(3) # 線の太さを設定

t.begin_fill()
t.circle(80)
t.end_fill()

# 別の例:線の色を青、塗りつぶし色をオレンジ
t.penup()
t.goto(-150, 0)
t.pendown()

t.color("blue", "orange")
t.pensize(2)

t.begin_fill()
for _ in range(5): # 五角形を描画
    t.forward(70)
    t.left(72)
t.end_fill()

turtle.done()
  • t.pensize() で線の太さを変えることで、より見やすい図形になります。
  • t.color("black", "yellow") のように2つの引数を渡すことで、pencolor()fillcolor() を同時に設定できます。


ここでは、turtle.fillcolor()の「代替」というよりも、**「turtle.fillcolor()の機能を含む、または補完する関連メソッドとプログラミング手法」**として説明します。

turtle.color() メソッドを使用する

turtle.color() メソッドは、線の色(pencolor)と塗りつぶし色(fillcolor)を同時に設定できる多機能なメソッドです。fillcolor() は塗りつぶし色のみを設定するのに対し、color() は引数の与え方によって挙動が変わります。

使い方:

  • 引数を2つ指定する場合
    t.color("線の色", "塗りつぶし色") または t.color((R1, G1, B1), (R2, G2, B2))
    • 1つ目の引数が線の色、2つ目の引数が塗りつぶし色として設定されます。
  • 引数を1つ指定する場合
    t.color("色名") または t.color(R, G, B)
    • この場合、線の色と塗りつぶし色の両方が指定した色に設定されます。


import turtle

t = turtle.Turtle()
t.speed(1)

# 方法A: color() で線の色と塗りつぶし色を両方設定
t.color("red") # 線も塗りつぶしも赤になる
t.begin_fill()
t.circle(50)
t.end_fill()

# 方法B: color() で線の色と塗りつぶし色を別々に設定
t.penup()
t.goto(100, 0)
t.pendown()

t.color("black", "yellow") # 線は黒、塗りつぶしは黄色
t.begin_fill()
for _ in range(4):
    t.forward(80)
    t.right(90)
t.end_fill()

turtle.done()

fillcolor()との関係
t.color("black", "yellow") は、実質的に t.pencolor("black")t.fillcolor("yellow") を同時に実行しているのと同じです。もし線の色も同時に設定したい場合は、color() が便利です。

colormode() と RGB/HEX値の組み合わせ

これは「代替」というよりは「fillcolor()と組み合わせて使う高度な色指定方法」ですが、fillcolor()で直接色の名前を指定する以外の方法として重要です。

  • HEXコードで指定
    "#RRGGBB" の形式で16進数のカラーコードを指定することもできます。これは colormode の設定に依存しません。
    import turtle
    
    t = turtle.Turtle()
    
    t.fillcolor("#FF00FF") # マゼンタ
    t.begin_fill()
    t.dot(100) # 大きな点
    t.end_fill()
    
    turtle.done()
    
  • RGB値 (0.0-1.0) で指定
    turtle.colormode(1.0) (デフォルト) の場合、RGB値を0.0から1.0の浮動小数点数で指定できます。
    import turtle
    
    t = turtle.Turtle()
    turtle.colormode(1.0) # デフォルトなので省略可能
    
    t.fillcolor(0.5, 0.8, 0.2) # 明るい緑っぽい色
    t.begin_fill()
    t.square(100) # (Python 3.10以降で追加されたかもしれない関数)
    # または手動で四角形を描画
    for _ in range(4):
        t.forward(100)
        t.right(90)
    t.end_fill()
    
    turtle.done()
    
  • RGB値 (0-255) で指定
    turtle.colormode(255) を設定すると、RGB値を0から255の整数で指定できます。
    import turtle
    
    t = turtle.Turtle()
    turtle.colormode(255) # カラーモードを255に設定
    
    t.fillcolor(255, 100, 0) # オレンジっぽい色
    t.begin_fill()
    t.circle(60)
    t.end_fill()
    
    turtle.done()
    

fillcolor()との関係
これらの方法は、fillcolor()関数に渡す引数の形式が異なるだけで、fillcolor()自体を使わないわけではありません。しかし、色の指定の柔軟性を高める「代替的な指定方法」として非常に重要です。

これは図形の塗りつぶしとは直接関係ありませんが、画面全体の背景色を設定する方法として、視覚的な「塗りつぶし」効果を考える際に言及されることがあります。


import turtle

screen = turtle.Screen()
screen.bgcolor("lightgray") # 画面全体の背景色を薄い灰色に設定

t = turtle.Turtle()
t.fillcolor("blue") # タートルの塗りつぶし色を設定

t.begin_fill()
t.circle(50)
t.end_fill()

turtle.done()

fillcolor()との関係
bgcolor() はタートルが描画する図形の内部を塗りつぶすものではなく、描画が行われるキャンバス全体の背景色を変えるものです。したがって、fillcolor()の直接的な代替ではありませんが、プログラム全体の配色を考える際には重要な要素です。

Pythonのturtleモジュールにおいて、図形を塗りつぶすための最も直接的で推奨される方法はturtle.fillcolor()begin_fill()/end_fill()の組み合わせです。

「代替方法」として挙げられるのは、主に以下の2点です。

  1. turtle.color() を使う
    線の色と塗りつぶし色を同時に設定したい場合に便利です。特に引数を2つ与える形式は、pencolor()fillcolor()を一度に設定するショートカットとなります。
  2. fillcolor() にRGB値やHEXコードを渡す
    色の名前だけでなく、より細かく色を制御したい場合に利用します。turtle.colormode() の設定が重要になります。