初心者必見!Python Turtle `bgcolor()` で描画を彩る方法と実践例

2025-06-06

turtle.bgcolor()とは

turtle.bgcolor()は、Pythonの turtle モジュールで使用される関数で、タートルグラフィックスの描画ウィンドウの背景色を設定するために使われます。

使用方法

この関数は非常にシンプルです。引数として色名を文字列で渡すか、RGB値をタプルで渡すことで、背景色を変更できます。

例1:色名を指定する

import turtle

turtle.bgcolor("lightgreen") # 背景色を薄い緑色に設定
turtle.setup(width=600, height=400) # ウィンドウサイズを設定(任意)
turtle.done() # ウィンドウを開いたままにする

このコードを実行すると、タートルの描画ウィンドウの背景が「lightgreen」になります。

例2:RGB値を指定する

RGB値(赤、緑、青の光の三原色の組み合わせ)を使って色を指定することもできます。それぞれの色の強度は0から255の範囲で指定します。

import turtle

# RGB値 (0-255, 0-255, 0-255) で背景色を設定
turtle.bgcolor((100, 150, 200)) # 少し青みがかったグレーのような色
turtle.setup(width=600, height=400)
turtle.done()

このコードでは、R=100, G=150, B=200 のRGB値で背景色を設定しています。

turtle.bgcolor() を使う主な理由は以下の通りです。

  • テーマの設定
    シーンやアニメーションに特定の雰囲気やテーマを設定するために、適切な背景色を選ぶことができます。
  • 描画対象の強調
    特定の図形や線を目立たせるために、背景色を調整することができます。
  • 視覚的な appeal の向上
    プログラムに色を加えることで、より魅力的で分かりやすいグラフィックスを作成できます。


turtle.bgcolor()は比較的シンプルな関数ですが、それでもいくつかの一般的なエラーが発生する可能性があります。

色名のスペルミス (NameError / ValueError)

これは最もよくあるエラーの一つです。Pythonは指定された色名を認識できない場合にエラーを発生させます。

エラーの例

Unknown color name: grean

原因
"green""grean"と入力するなど、色名のスペルを間違えている場合。

トラブルシューティング

  • RGB値を使用する
    スペルミスを避けるために、turtle.bgcolor((R, G, B)) のようにRGB値で色を指定することを検討してください。これは常に正確な色を指定できる方法です。
  • 有効な色名を使用する
    タートルグラフィックスが認識する色名(CSS標準の色名など)を使用しているか確認してください。一般的な色名であれば問題ないはずです。
  • スペルを確認する
    色名のスペルが正しいか再確認してください。よくある間違いとして、「grey」と「gray」(どちらも正しいが、Pythonのタートルでは通常「gray」がより一般的)、「maroon」(マロン色)などがあります。

引数の型が正しくない (TypeError)

turtle.bgcolor()は、色名を文字列で渡すか、RGB値をタプルで渡すことを期待します。これ以外の型を渡すとTypeErrorが発生します。

エラーの例

TypeError: bgcolor() takes 1 positional argument but 2 were given
TypeError: invalid color string: 123

原因

  • RGB値をタプルではなくリストで渡している([(100, 150, 200)]はOKですが、[100, 150, 200]はダメ)。
  • 数値そのものを渡している(例: turtle.bgcolor(123))。
  • 複数の引数を渡している(例: turtle.bgcolor("red", "blue"))。

トラブルシューティング

  • RGB値はタプルで
    RGB値を指定する場合は、必ず(R, G, B)のようなタプルで囲んでください。[R, G, B]のようなリストではエラーになる場合があります。
  • 引数は一つであること
    bgcolor()に渡す引数は、色名を示す単一の文字列か、RGB値を示す単一のタプルであることを確認してください。

モジュールがインポートされていない (NameError)

turtleモジュールをインポートせずにturtle.bgcolor()を呼び出そうとするとエラーになります。

エラーの例

NameError: name 'turtle' is not defined

原因
コードの先頭にimport turtleを記述し忘れている。

トラブルシューティング

  • コードの冒頭でimport turtleを記述していることを確認してください。

背景色が変わらない/意図した色にならない

エラーメッセージは出ないが、背景色が変わらない、または期待した色にならない場合があります。

原因

  • turtle.done()を呼び出していない、またはプログラムがすぐに終了してしまう
    背景色を設定しても、ウィンドウがすぐに閉じてしまうため、変更が見えない。
  • 他の描画が背景色を隠している
    非常に大きな図形や画像が背景全体を覆い隠している場合。
  • 色の指定が不正確
    指定した色名が期待通りの色を表していない場合(例: "orange"と指定したが、もっと鮮やかなオレンジを期待していた)。

トラブルシューティング

  • 描画順序を確認
    もし他の要素が背景を覆っている場合は、描画の順序を見直す必要があるかもしれません。
  • turtle.done()を使う
    プログラムの最後にturtle.done()を呼び出すことで、タートルグラフィックスのウィンドウが開いたままになり、背景色の変更を確認できます。
  • RGB値を試す
    特定の色を正確に表現したい場合は、RGB値を試すのが最も確実な方法です。
  • 色名を再確認
    目的の色が正確に表現される色名であるか確認してください。必要であれば、オンラインの色見本サイトなどで正確な色名やRGB値を確認しましょう。

コードの実行環境の問題

稀に、特定のIDEや環境でタートルグラフィックスの表示に問題が生じることがあります。

  • 別の環境で試す
    もし可能であれば、コマンドプロンプトや別のIDE(VS Codeなど)で実行してみて、環境の問題であるかを確認してください。
  • Pythonを再起動する
    特にIDLEなどの環境では、セッションを再起動することで問題が解決することがあります。


turtle.bgcolor()は、タートルグラフィックスの描画画面の背景色を設定するために使われます。様々な方法で色を指定できるため、表現の幅が広がります。

例1: 基本的な色名で背景色を設定する

最もシンプルで一般的な使い方です。認識されている色名を文字列で指定します。

import turtle

# 背景色を「lightblue」(水色)に設定
turtle.bgcolor("lightblue")

# タートル(亀)の形状と色を設定
turtle.shape("turtle")
turtle.color("darkgreen")
turtle.pensize(3)

# 図形を描画
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(100)

# 描画ウィンドウが開いたままになるようにする
turtle.done()

解説
turtle.bgcolor("lightblue")によって、ウィンドウ全体が水色になります。その後、通常のタートルグラフィックスの描画が行われます。

例2: RGB値で背景色を設定する

色名を指定する代わりに、赤(Red)、緑(Green)、青(Blue)の光の三原色の組み合わせで色を指定することもできます。それぞれの値は0から255の範囲です。

import turtle

# RGB値で背景色を紫がかった色に設定 (R=150, G=0, B=200)
# colormode(255) を設定することで、RGB値を0-255の範囲で指定できるようになります。
# デフォルトは0-1.0の範囲です。
turtle.colormode(255)
turtle.bgcolor((150, 0, 200)) # RGB値をタプルで渡す

turtle.shape("circle")
turtle.color("yellow")
turtle.pensize(5)

# 複数の円を描画
for _ in range(6):
    turtle.circle(50)
    turtle.left(60)

turtle.done()

解説
turtle.colormode(255)を呼び出すことで、次のbgcolorの呼び出しで0-255のRGB値を指定できるようになります。指定しない場合、RGB値は0.0-1.0の浮動小数点数で指定する必要があります。

例3: 16進数カラーコードで背景色を設定する

Webデザインなどでおなじみの16進数カラーコード(例: #RRGGBB)も利用できます。

import turtle

# 16進数カラーコードで背景色を「#FFD700」(ゴールド)に設定
turtle.bgcolor("#FFD700")

turtle.shape("arrow")
turtle.color("black")
turtle.speed(0) # 描画速度を最速に設定

# 星を描画
for _ in range(5):
    turtle.forward(150)
    turtle.right(144)

turtle.done()

解説
"#FFD700"のように#から始まる16進数文字列を渡すことで、特定のウェブカラーを指定できます。

例4: 背景色を動的に変更するアニメーション

turtle.bgcolor()をループ内で使うことで、背景色を連続的に変化させるアニメーションを作成できます。

import turtle
import time # 時間を制御するためにtimeモジュールをインポート

screen = turtle.Screen() # スクリーンオブジェクトを取得
screen.setup(width=600, height=400)
screen.colormode(255) # RGB値を0-255で指定できるように設定

colors = ["red", "orange", "yellow", "green", "blue", "purple"]
rgb_colors = [
    (255, 0, 0),    # 赤
    (255, 165, 0),  # オレンジ
    (255, 255, 0),  # 黄色
    (0, 128, 0),    # 緑
    (0, 0, 255),    # 青
    (128, 0, 128)   # 紫
]

t = turtle.Turtle()
t.hideturtle() # タートルを非表示にする
t.speed(0)

# 色名を順番に切り替える
print("色名で背景色を変更中...")
for color_name in colors:
    screen.bgcolor(color_name)
    time.sleep(0.5) # 0.5秒待機

# RGB値を順番に切り替える
print("RGB値で背景色を変更中...")
for r, g, b in rgb_colors:
    screen.bgcolor((r, g, b))
    time.sleep(0.5) # 0.5秒待機

print("アニメーション終了。")
screen.done()

解説
この例では、time.sleep()を使って各色の表示間に一時停止を挟み、背景色が段階的に変化する様子を見せています。screen = turtle.Screen()としてスクリーンオブジェクトを明示的に取得し、そのbgcolorメソッドを呼び出す方法もよく使われます(turtle.bgcolor()は内部で現在のスクリーンオブジェクトのbgcolorメソッドを呼び出しています)。



turtle.bgcolor()は背景色を設定する最も直接的で一般的な方法ですが、状況によっては他のアプローチが有効な場合があります。

Screenオブジェクトのbgcolor()メソッドを使用する

厳密にはturtle.bgcolor()と同じことをしているのですが、明示的にScreenオブジェクト(描画ウィンドウ全体を管理するオブジェクト)のメソッドとして呼び出す方法です。これはよりオブジェクト指向的なアプローチと見なせます。

import turtle

# Screenオブジェクトを取得
screen = turtle.Screen()

# Screenオブジェクトのbgcolorメソッドで背景色を設定
screen.bgcolor("lightcoral") # 薄いサンゴ色

t = turtle.Turtle()
t.pensize(5)
t.forward(100)

screen.done()

解説
turtle.Screen()で現在の描画スクリーンへの参照を取得し、そのscreenオブジェクトに対して.bgcolor()を呼び出します。機能的にはturtle.bgcolor()と全く同じですが、大規模なプログラムで複数の画面を扱う場合や、コードの可読性を高めたい場合に、この明示的なアプローチが好まれることがあります。

背景に画像を使用する (Screen.bgpic())

背景を単色ではなく、画像ファイルに設定したい場合はturtle.Screen()オブジェクトのbgpic()メソッドを使用します。

import turtle

screen = turtle.Screen()

# 背景に画像ファイルを設定
# 注意: 'background_image.gif' は実行するPythonスクリプトと同じディレクトリに存在する必要があります。
# 対応する画像形式はGIFです。PNGやJPGは直接はサポートされていません。
# 他の形式を使用する場合は、PillowなどのライブラリでGIFに変換する必要があります。
screen.bgpic("background_image.gif")

t = turtle.Turtle()
t.color("white")
t.write("Hello Turtle!", align="center", font=("Arial", 24, "bold"))

screen.done()

解説

  • bgpic()を使用すると、bgcolor()で設定した背景色は上書きされます。
  • 重要な注意点
    turtleモジュールが直接サポートする画像形式はGIFのみです。PNGやJPGなどの一般的な画像ファイルを使用したい場合は、事前にGIF形式に変換しておくか、Pillowのような外部ライブラリを使用して画像を読み込み、それをタートルで扱える形式に変換する必要があります。
  • screen.bgpic("ファイル名.gif") の形式で呼び出します。

複数のタートルを使って背景を描画する (手動で背景を作成)

これは「代替」というよりは「工夫」に近いですが、背景を単色や単純な画像ではなく、複数の図形や色を使って複雑に描画したい場合に用いる方法です。これは、背景をプログラムで生成する際に非常に柔軟な制御を可能にします。

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.tracer(0) # アニメーションをオフにして高速描画

# 背景用のタートルを作成
bg_turtle = turtle.Turtle()
bg_turtle.hideturtle() # タートル自体は表示しない
bg_turtle.speed(0) # 描画速度を最速に
bg_turtle.penup() # 線を描かない
bg_turtle.goto(-300, -200) # 左下隅へ移動
bg_turtle.pendown() # 線を描く準備

# グラデーションのような背景を作成 (例: 複数の四角形を描く)
colors = ["#ADD8E6", "#87CEEB", "#6495ED", "#4169E1"] # 青系のグラデーション
current_y = -200
for color in colors:
    bg_turtle.fillcolor(color)
    bg_turtle.begin_fill()
    bg_turtle.forward(600)
    bg_turtle.left(90)
    bg_turtle.forward(100)
    bg_turtle.left(90)
    bg_turtle.forward(600)
    bg_turtle.left(90)
    bg_turtle.forward(100)
    bg_turtle.left(90)
    bg_turtle.end_fill()
    current_y += 100
    bg_turtle.goto(-300, current_y)

# メインのタートルで描画
main_turtle = turtle.Turtle()
main_turtle.color("red")
main_turtle.pensize(3)
main_turtle.goto(0, 50) # 中央上部へ移動
main_turtle.circle(50)

screen.update() # 描画を更新して表示
screen.done()
  • この方法は非常に柔軟ですが、背景の描画コードが複雑になる可能性があります。
  • 複数のfillcolor()begin_fill()/end_fill()を使って、グラデーションや模様のある背景を作成します。
  • screen.tracer(0)screen.update()を使用することで、描画プロセスをユーザーに見せず、一度に完成した背景を表示することができます。これは複雑な背景を描画する際にパフォーマンスを向上させます。