turtle.setup()
turtle.setup()
とは
turtle.setup()
は、Pythonのタートルグラフィックスにおいて、描画が行われるキャンバス(ウィンドウ)のサイズと位置を設定するための関数です。この関数を使うことで、タートルが絵を描く画面の大きさや、それがPCの画面上のどこに表示されるかを細かく制御できます。
引数
turtle.setup()
には、通常以下の4つの引数を指定します。
width
:- キャンバスの幅を設定します。
- 数値でピクセル単位の幅を指定することもできます(例:
800
で800ピクセル幅)。 - 文字列で「画面の何パーセントか」を指定することもできます(例:
"0.75"
で画面幅の75%)。
height
:- キャンバスの高さを設定します。
width
と同様に、ピクセル単位の数値、またはパーセントを示す文字列で指定します。
startx
:- キャンバスの左上隅のX座標を設定します。
- PC画面の左上を原点
(0, 0)
として、右方向が正です。 - 省略した場合、キャンバスは画面の中央に配置されます。
starty
:- キャンバスの左上隅のY座標を設定します。
- PC画面の左上を原点
(0, 0)
として、下方向が正です。 - 省略した場合、キャンバスは画面の中央に配置されます。
使用例
import turtle
# キャンバスの幅を800ピクセル、高さを600ピクセルに設定し、
# 画面の中央に表示する
turtle.setup(width=800, height=600)
# キャンバスの幅を画面の80%、高さを画面の70%に設定し、
# 左上隅を(50, 50)の位置に配置する
# turtle.setup(width="0.8", height="0.7", startx=50, starty=50)
# タートルを動かす例
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.done() # 描画ウィンドウを閉じないようにする
- プレゼンテーション: 作成したグラフィックスを他人に見せる際に、最適な表示サイズと位置で表示することで、よりプロフェッショナルな印象を与えることができます。
- レイアウトの制御: 複数のタートルグラフィックスのプログラムを同時に実行する場合など、ウィンドウの配置を意図的に制御したい場合に便利です。
- 見やすい画面の確保: プログラムの実行時に、描画されるウィンドウが小さすぎたり、画面の端に隠れてしまったりするのを防ぎ、ユーザーが見やすいように調整できます。
turtle.setup()
に関連する一般的なエラーとトラブルシューティング
turtle
モジュールはPythonの標準ライブラリに含まれており、比較的簡単にグラフィックプログラミングを始められるため、初心者にも人気があります。しかし、いくつか注意すべき点や、一般的なエラーが発生する可能性があります。
No module named '_tkinter' エラー
これはturtle
モジュールそのものの問題というより、turtle
が依存しているtkinter
ライブラリが正しくインストールされていないか、利用できない場合に発生します。turtle
はtkinter
を使ってグラフィックウィンドウを表示しているため、これが不足していると動作しません。
エラーメッセージの例
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.x/turtle.py", line 107, in <module>
import _tkinter # Tkinter was not available or not installed.
ModuleNotFoundError: No module named '_tkinter'
トラブルシューティング
- 仮想環境を使用している場合
仮想環境内でtkinter
が利用できるか確認してください。システムワイドでインストールされていても、仮想環境では別途設定が必要な場合があります。 - Windowsの場合
通常、Pythonのインストーラーで「Tcl/Tk」のオプションを有効にしてインストールしていれば問題ありません。もしインストール時にこのオプションを外していた場合は、Pythonを再インストールするか、tkinter
のみをインストールする方法を探す必要があります(ただし、再インストールが最も確実です)。 - macOSの場合
PythonをHomebrewなどでインストールした場合、tkinter
も一緒にインストールされることが多いですが、そうでない場合は別途インストールが必要な場合があります。 - Linuxの場合
多くのLinuxディストリビューションでは、tkinter
はPythonとは別にインストールする必要があります。- Debian/Ubuntu:
sudo apt-get install python3-tk
- Fedora/CentOS:
sudo dnf install python3-tkinter
またはsudo yum install python3-tkinter
- Debian/Ubuntu:
引数の型エラー (TypeError または ValueError)
turtle.setup()
の引数(width
, height
, startx
, starty
)には、数値または特定の形式の文字列を指定する必要があります。誤った型や形式の値を渡すとエラーになります。
エラーの例
- 文字列を数値として解釈できない場合
turtle.setup(width="eight hundred", height=600) # "eight hundred" は数値ではない # ValueError: bad argument: -string-
トラブルシューティング
- 文字列の形式を確認する
パーセンテージで指定する場合は、必ず"0.x"
の形式にしてください。 - 引数の型を確認する
width
とheight
は整数(ピクセル数)または文字列(画面の割合を示す"0.5"のような形式)である必要があります。startx
とstarty
は整数である必要があります。
ウィンドウが表示されない、すぐに閉じてしまう
これはエラーメッセージが出るわけではありませんが、プログラムを実行しても一瞬ウィンドウが表示されてすぐに消えたり、全く表示されなかったりする場合があります。
原因
- プログラムのロジックの問題
描画処理が非常に速く完了し、その後にプログラムがすぐに終了してしまう場合。 - turtle.done() または turtle.exitonclick() の欠落
turtle
グラフィックスでは、描画が終わった後にウィンドウを維持するためにturtle.done()
(またはturtle.exitonclick()
)を呼び出す必要があります。これがないと、プログラムが終了すると同時にウィンドウも閉じられてしまいます。
トラブルシューティング
- turtle.exitonclick() を使用する
ウィンドウをクリックすると閉じるようにしたい場合は、turtle.done()
の代わりにturtle.exitonclick()
を使用します。
ウィンドウの配置が期待通りにならない
startx
やstarty
の指定が正しくない場合や、複数のモニター環境などで意図しない位置にウィンドウが表示されることがあります。
トラブルシューティング
- デフォルトの中央配置を利用する
特定の位置にこだわる必要がない場合は、startx
とstarty
を省略し、デフォルトで中央に配置されるようにすることもできます。 - 試行錯誤
目的の位置に表示されるまで、startx
とstarty
の値を調整してみてください。 - 座標系の理解
startx
とstarty
は、PC画面の左上隅を(0, 0)
として、X軸は右に、Y軸は下に正の方向で増えます。この座標系を理解して値を設定してください。
複数のturtle.setup()呼び出し
基本的にはturtle.setup()
は一度だけ呼び出すべきです。複数回呼び出すと、予期しない動作を引き起こす可能性があります。例えば、新しいウィンドウが開かれたり、既存のウィンドウの設定が上書きされたりすることがあります。
- プログラムを見直す
turtle.setup()
が複数回呼び出されていないか確認し、必要であれば一度だけ呼び出すように修正してください。ウィンドウのサイズや位置を変更したい場合は、プログラムの初期段階で一度設定します。
- 公式ドキュメントを参照する
turtle
モジュールの公式ドキュメントは、各関数の詳細な説明と使用例が載っており、非常に役立ちます。 - 簡単なコードで試す
問題が発生した場合、複雑な描画コードを一時的にコメントアウトし、turtle.setup()
とその後の最小限の描画(例:turtle.forward(10)
)とturtle.done()
だけで動作するかを確認してみてください。 - エラーメッセージをよく読む
Pythonのエラーメッセージは、どこで何が起こったかを示しています。特にTypeError
やValueError
の場合、原因が引数の型や値にあることが多いです。
turtle.setup()
は、タートルグラフィックスの描画ウィンドウ(キャンバス)のサイズと位置を制御するために使用されます。いくつかの具体的な例を通じて、その使い方を見ていきましょう。
例1: デフォルトサイズと位置(setup()
を使わない場合と比較)
まず、turtle.setup()
を使わない場合の挙動を確認し、その後で基本的な使い方を比較します。
コード (setup()なし)
import turtle
# ウィンドウのサイズと位置を指定しない場合
# デフォルトで中央に、ある程度の大きさで表示されます。
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.done()
解説
turtle.setup()
を呼び出さない場合、turtle
は実行環境によって決定されるデフォルトのウィンドウサイズと位置を使用します。多くの場合、画面の中央に、ある程度の標準的なサイズでウィンドウが表示されます。
コード (基本的なsetup()の使用)
import turtle
# 幅800ピクセル、高さ600ピクセルのウィンドウを画面の中央に設定
turtle.setup(width=800, height=600)
# タートルを動かす
turtle.forward(100)
turtle.left(90)
turtle.forward(100)
turtle.done()
解説
この例では、width
とheight
引数にそれぞれ800
と600
を指定しています。これにより、800x600ピクセルの描画ウィンドウが作成されます。startx
とstarty
を指定しないため、ウィンドウは画面の中央に配置されます。
例2: ウィンドウの特定の座標への配置
startx
とstarty
引数を使用して、ウィンドウの左上隅を画面上の特定の座標に配置します。
コード
import turtle
# 幅500ピクセル、高さ400ピクセルのウィンドウを
# 画面の左上からX=100ピクセル、Y=50ピクセルの位置に設定
turtle.setup(width=500, height=400, startx=100, starty=50)
# タートルを動かす
turtle.circle(50) # 半径50の円を描く
turtle.dot(10) # 直径10の点を描く
turtle.done()
解説
startx=100, starty=50
: ウィンドウの左上隅が、PC画面の左上(原点(0,0))から右へ100ピクセル、下へ50ピクセル移動した位置に配置されます。width=500, height=400
: ウィンドウのサイズを500x400ピクセルに設定します。
例3: 画面の割合でウィンドウサイズを指定する
width
とheight
に浮動小数点数の文字列を指定することで、画面全体の割合でウィンドウサイズを設定できます。
コード
import turtle
# ウィンドウの幅を画面全体の75%、高さを画面全体の60%に設定
# 位置は中央(デフォルト)
turtle.setup(width="0.75", height="0.6")
# タートルで簡単な図形を描く
turtle.speed(0) # 描画速度を最速に
for i in range(4):
turtle.forward(150)
turtle.left(90)
turtle.done()
解説
height="0.6"
: 画面全体の高さの60%をウィンドウの高さとします。 この方法は、異なる解像度のディスプレイで実行しても、ある程度の比率を保ちたい場合に便利です。width="0.75"
: 画面全体の幅の75%をウィンドウの幅とします。
例4: 複数のタートルとウィンドウサイズ設定
一つのスクリプト内で、ウィンドウサイズを設定し、複数のタートルオブジェクトを扱う例です。turtle.setup()
はウィンドウ全体の設定のため、個々のタートルに影響を与えるわけではありませんが、描画環境全体を準備する上で重要です。
コード
import turtle
# ウィンドウを幅900ピクセル、高さ700ピクセルに設定し、左上から少しずらして配置
turtle.setup(width=900, height=700, startx=20, starty=20)
# 最初のタートル
t1 = turtle.Turtle()
t1.color("blue")
t1.pensize(3)
t1.shape("turtle")
t1.forward(150)
t1.right(90)
t1.forward(150)
# 2番目のタートル
t2 = turtle.Turtle()
t2.color("red")
t2.pensize(2)
t2.shape("arrow")
t2.penup() # ペンを上げる
t2.goto(-100, -100) # 移動
t2.pendown() # ペンを下げる
t2.circle(80)
turtle.done()
解説
この例では、turtle.setup()
で大きな描画エリアを確保し、その中でt1
とt2
という2つの異なるタートルオブジェクトがそれぞれ独立して描画を行っています。turtle.setup()
は、これらのタートルが活動する「舞台」を設定する役割を担っています。
turtle.setup()
は、タートルグラフィックスの描画ウィンドウを柔軟に制御するための非常に便利な関数です。
startx
,starty
: ウィンドウの左上隅のX, Y座標をピクセル単位で指定し、画面上のどこにウィンドウを配置するかを決めます。これらを省略すると、ウィンドウは画面の中央に配置されます。width
,height
: ウィンドウの幅と高さをピクセル単位の数値、または画面の割合を示す文字列("0.x"
)で指定します。
turtle.setup()
はタートルグラフィックスのウィンドウサイズと位置を設定する主要な方法ですが、完全に代替できる関数は他にありません。しかし、同様の目的を達成するためにturtle
モジュールの他の関数を組み合わせたり、特定の状況で別の関数を使用したりする方法はあります。
turtle.Screen() オブジェクトのメソッドを使用する
turtle
モジュールの関数は、通常、内部でデフォルトのScreen
オブジェクトを操作しています。明示的にScreen
オブジェクトを作成し、そのメソッドを呼び出すことで、よりオブジェクト指向的にウィンドウを設定できます。
Screenオブジェクトのsetup()メソッド
turtle.setup()
は、実はturtle.Screen().setup()
のエイリアス(別名)です。したがって、明示的にScreen
オブジェクトを作成してsetup()
を呼び出すことは、全く同じ効果を持ちます。
import turtle
# 明示的にScreenオブジェクトを作成
screen = turtle.Screen()
# Screenオブジェクトのsetup()メソッドを呼び出す
screen.setup(width=800, height=600, startx=0, starty=0)
# タートルオブジェクトを作成(Screenオブジェクトに紐づく)
t = turtle.Turtle()
t.forward(100)
turtle.done()
解説
これはturtle.setup()
と機能的には全く同じですが、大規模なプログラムで複数の画面やより細かな制御が必要な場合に、Screen
オブジェクトを明示的に扱うことがコードの可読性や管理性を高めることがあります。
Screenオブジェクトのscreensize()メソッド
screensize()
は、キャンバスの「論理的な」サイズを設定します。これは、ウィンドウ自体のサイズとは少し異なります。screensize()
で設定された領域は、ウィンドウサイズを超えてスクロール可能な仮想キャンバスのようなものです。通常、setup()
で設定されたウィンドウサイズが優先されますが、描画がウィンドウの外に出た場合に備えて、内部のキャンバスサイズを大きくすることができます。
import turtle
screen = turtle.Screen()
# ウィンドウサイズはsetup()で設定
screen.setup(width=600, height=400)
# 論理的なキャンバスサイズをウィンドウサイズより大きく設定
# これにより、ウィンドウの外に描画してもデータは保持される
screen.screensize(canvwidth=1000, canvheight=800, bg="lightgray")
t = turtle.Turtle()
t.speed(0) # 最速
# ウィンドウ外に描画を試みる
t.penup()
t.goto(-400, 0)
t.pendown()
t.forward(800) # ウィンドウ幅(600)を超えて描画
turtle.done()
解説
bg="lightgray"
: キャンバスの背景色を設定します。screen.screensize(canvwidth=1000, canvheight=800, bg="lightgray")
: 内部的なキャンバスのサイズを1000x800に設定します。これにより、タートルがウィンドウの端を越えて移動しても、描画された内容は内部的に保持されます。ウィンドウを最大化したり、サイズを変更したりすると、隠れていた部分が見えるようになります。screen.setup(width=600, height=400)
: ウィンドウの物理的なサイズを600x400に設定します。
screensize()
は、直接的にウィンドウの「表示サイズ」を設定するものではなく、主に描画可能な「範囲」を広げるために使われます。
ウィンドウのタイトルを設定する
直接的な代替ではありませんが、ウィンドウを識別しやすくするためにタイトルを設定することも関連する設定として重要です。
import turtle
screen = turtle.Screen()
# ウィンドウのタイトルを設定
screen.title("私の素敵なタートルグラフィックス")
screen.setup(width=700, height=500)
t = turtle.Turtle()
t.color("green")
t.circle(70)
turtle.done()
解説
screen.title("...")
メソッドで、ウィンドウのタイトルバーに表示されるテキストを変更できます。これはユーザーエクスペリエンスの向上に役立ちます。
ウィンドウの背景色を設定する
これもturtle.setup()
の直接の代替ではありませんが、描画環境の設定として非常に一般的です。
import turtle
screen = turtle.Screen()
# ウィンドウの背景色を設定
screen.bgcolor("lightblue") # または "skyblue", "#RRGGBB" など
screen.setup(width=600, height=600)
t = turtle.Turtle()
t.color("darkblue")
for _ in range(3):
t.forward(100)
t.left(120)
turtle.done()
解説
screen.bgcolor()
メソッドで、ウィンドウの背景色を設定できます。これは、グラフィックスの見た目を大きく左右する要素です。
turtle.setup()
は、タートルグラフィックスの描画ウィンドウの物理的なサイズと画面上での位置を設定する最も直接的で推奨される方法です。