turtle.fillcolor()
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()
- 0〜255で指定したい場合:
-
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()
解説
import turtle
でturtle
モジュールをインポートします。t = turtle.Turtle()
でタートルオブジェクトを作成します。t.fillcolor("skyblue")
で塗りつぶしの色を「水色」に設定します。t.begin_fill()
を呼び出すと、これ以降の描画が塗りつぶしの対象になります。for _ in range(4): ...
で100ピクセルの四角形を描画します。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()
解説
turtle.colormode(255)
を設定することで、RGB値を0から255までの整数で指定できるようになります。この設定がない場合、RGB値は0.0から1.0までの浮動小数点数で指定する必要があります。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点です。
- turtle.color() を使う
線の色と塗りつぶし色を同時に設定したい場合に便利です。特に引数を2つ与える形式は、pencolor()
とfillcolor()
を一度に設定するショートカットとなります。 - fillcolor() にRGB値やHEXコードを渡す
色の名前だけでなく、より細かく色を制御したい場合に利用します。turtle.colormode()
の設定が重要になります。