Python Turtle: screensize()徹底解説 - 描画領域を自在に操る
turtle.screensize()
の基本的な使い方
この関数は、引数を与えるかどうかで挙動が変わります。
-
引数なしで呼び出す場合: 描画領域の現在の幅と高さをピクセル単位で返します。戻り値はタプル
(width, height)
です。例:
import turtle screen = turtle.Screen() print(screen.screensize()) # 出力例: (400, 300) ← デフォルトのサイズは通常400x300ピクセルです
-
引数を与えて呼び出す場合: 描画領域の幅と高さを設定します。通常、
width
とheight
の2つの引数をピクセル単位で指定します。オプションでbg
(背景色) も指定できます。turtle.screensize(width=None, height=None, bg=None)
width
: 描画領域の幅をピクセル単位で指定します。height
: 描画領域の高さをピクセル単位で指定します。bg
: 描画領域の背景色を指定します。色名は文字列(例: "red", "blue")またはRGB値のタプル(例: (0.5, 0.5, 0.5))で指定できます。
import turtle screen = turtle.Screen() # 描画領域のサイズを600x400ピクセルに設定し、背景色を水色にする screen.screensize(canvwidth=600, canvheight=400, bg="lightblue") # タートルを動かして確認 my_turtle = turtle.Turtle() my_turtle.forward(100) turtle.done()
タートルグラフィックスには turtle.setup()
という似たような関数もありますが、これらには重要な違いがあります。
-
turtle.setup()
:- タートルグラフィックスの ウィンドウ自体のサイズと位置 を設定します。
width
とheight
を指定すると、ウィンドウの物理的なサイズがその値になります。- 描画領域のサイズは、通常、ウィンドウのサイズに合わせられます。
-
turtle.screensize()
:- 描画領域(キャンバス) の論理的なサイズを設定します。これは、タートルが移動できる領域の「広さ」を決定します。
- デフォルトでは、この描画領域は画面の中央に配置され、ウィンドウサイズが描画領域よりも小さい場合でも、タートルは設定された広さの範囲内で移動できます(ただし、ウィンドウに表示されない部分は見えません)。
screensize()
で設定したサイズは、ウィンドウサイズとは独立しています。
import turtle
screen = turtle.Screen()
# setup() でウィンドウサイズを800x600に設定
screen.setup(width=800, height=600)
print(f"setup()後のscreensize(): {screen.screensize()}") # 通常はsetup()で設定したサイズに近くなります
# screensize() で描画領域を1000x800に設定
screen.screensize(canvwidth=1000, canvheight=800, bg="lightgreen")
print(f"screensize()後のscreensize(): {screen.screensize()}")
turtle.done()
この例では、setup()
でウィンドウサイズを設定した後、screensize()
で描画領域をさらに大きく設定しています。これにより、ウィンドウは800x600のままですが、タートルは1000x800の範囲で動き回ることができます。
-
screensize()
で設定したサイズが反映されない、または期待と異なる これは最もよくある誤解です。turtle.screensize()
は「描画領域(キャンバス)」のサイズを設定しますが、これは必ずしも「ウィンドウ」の物理的なサイズとは一致しません。- 原因:
screensize()
は、タートルが動き回れる仮想的な空間の広さを定義します。ウィンドウのサイズは、turtle.setup()
またはシステムによって自動的に設定されます。screensize()
で設定したキャンバスがウィンドウよりも大きい場合、スクロールバーが表示されることがあります(環境による)。 - トラブルシューティング:
- ウィンドウのサイズを制御したい場合:
turtle.setup(width=..., height=...)
を使用してください。setup()
は、ウィンドウの物理的なサイズを設定します。 - 描画領域をウィンドウサイズに合わせたい場合:
screen.screensize(screen.window_width(), screen.window_height())
のように、window_width()
とwindow_height()
を使って現在のウィンドウサイズを取得し、それをscreensize()
に設定することで、描画領域をウィンドウに合わせることができます。 - キャンバスサイズとウィンドウサイズの関係を理解する:
screensize()
は描画可能な領域を広げ、スクロール可能にするためのものです。ウィンドウの見た目のサイズを変えたい場合はsetup()
を使います。
- ウィンドウのサイズを制御したい場合:
- 原因:
-
screensize()
を呼び出してもスクロールバーが表示されないscreensize()
でキャンバスを大きくしても、必ずしもスクロールバーが表示されるとは限りません。- 原因: 環境(OS、Pythonのバージョン、Tkinterのバージョンなど)によっては、
turtle
が自動的にスクロールバーを提供しない場合があります。 - トラブルシューティング:
- 通常、
turtle.Screen()
オブジェクトが持つgetcanvas()
メソッドを通じてTkinterのCanvas
オブジェクトを取得し、それをスクロールバーと連携させることで実現できますが、これはturtle
モジュールの基本的な使い方を超えた高度な操作になります。 - 多くの場合、スクロールバーが必要になるような広大な描画は、
turtle
の用途から外れるため、別のグラフィックライブラリ(例:matplotlib
,pygame
など)の検討も視野に入れると良いでしょう。
- 通常、
- 原因: 環境(OS、Pythonのバージョン、Tkinterのバージョンなど)によっては、
-
引数の指定ミス(型エラー、引数不足/過多) 関数呼び出しの基本的なエラーです。
- 原因:
screensize()
はcanvwidth
,canvheight
,bg
という引数を期待します。これらを間違った型(例: 数値の代わりに文字列)で渡したり、スペルミスをしたりするとエラーになります。 - トラブルシューティング:
- エラーメッセージ(
TypeError
など)をよく読み、引数の型や数を確認してください。 turtle.screensize(width=800, height=600)
のように、キーワード引数を使うと、どの値が何を意味するのかが明確になり、間違いを減らせます。- 背景色を指定する場合は
bg="red"
のように文字列で色名を指定するか、(R, G, B)
のタプルで指定します。
- エラーメッセージ(
- 原因:
-
turtle
ウィンドウがすぐに閉じてしまう これはscreensize()
に直接関連するエラーではありませんが、turtle
プログラムでよくある問題です。- 原因: プログラムが終了すると、
turtle
ウィンドウも自動的に閉じます。ユーザーが描画結果を確認する前に閉じてしまうことがあります。 - トラブルシューティング:
- プログラムの最後に
turtle.done()
またはscreen.mainloop()
を追加します。これにより、ユーザーがウィンドウを閉じるまでプログラムが待機します。
import turtle screen = turtle.Screen() screen.screensize(800, 600) # ... タートルの描画コード ... turtle.done() # または screen.mainloop()
- プログラムの最後に
- 原因: プログラムが終了すると、
-
No module named '_tkinter'
エラー これはturtle
を使用する上で根本的な問題です。- 原因:
turtle
モジュールは、グラフィックスの表示にTkinter
(Tk interface) というGUIライブラリを使用しています。Pythonのインストール時にTkinter
が含まれていない場合、このエラーが発生します。 - トラブルシューティング:
- Pythonをインストールし直す際に、
Tkinter
のサポートを有効にするオプションを選択します(特にWindowsの場合)。 - Linux環境では、通常
python3-tk
のようなパッケージをインストールする必要があります(例:sudo apt-get install python3-tk
)。
- Pythonをインストールし直す際に、
- 原因:
- デバッグプリントを使う:
print(screen.screensize())
やprint(screen.window_width(), screen.window_height())
をコードの途中に挿入して、実行時のサイズがどうなっているかを確認すると、問題の切り分けに役立ちます。 - デフォルトサイズを理解する:
screensize()
を引数なしで呼び出すと、現在のキャンバスサイズが返されます。デフォルトは通常(400, 300)
です。このデフォルト値を意識することで、予期しないサイズの変更を避けられます。 - オブジェクト指向スタイルを使う:
turtle.Screen()
オブジェクトを作成し、そのメソッドとしてscreensize()
を呼び出すのが推奨されます。import turtle screen = turtle.Screen() screen.screensize(canvwidth=1000, canvheight=800) # または screen.screensize(1000, 800)
turtle.screensize()
は、タートルグラフィックスの描画領域(キャンバス)のサイズを設定または取得するために使われます。ここではいくつかの具体的な例を通じて、その使い方を説明します。
例1: デフォルトの描画領域サイズを確認する
まず、screensize()
を引数なしで呼び出して、デフォルトの描画領域のサイズを確認してみましょう。
import turtle
# Screenオブジェクトを作成
screen = turtle.Screen()
# デフォルトの描画領域のサイズを取得して表示
# 通常は (400, 300) が返されます(環境によって異なる場合もあります)
current_width, current_height = screen.screensize()
print(f"現在の描画領域のサイズ: 幅={current_width}px, 高さ={current_height}px")
# ウィンドウがすぐに閉じないように待機
turtle.done()
解説:
screen.screensize()
を引数なしで呼び出すと、現在のキャンバスの幅と高さをピクセル単位でタプルとして返します。多くの場合、デフォルトは幅400px、高さ300pxです。
例2: 描画領域のサイズを大きく設定する
タートルがより広い範囲で描画できるように、描画領域のサイズを大きく設定してみます。
import turtle
screen = turtle.Screen()
my_turtle = turtle.Turtle()
# 描画領域のサイズを800x600ピクセルに設定
# キーワード引数 'canvwidth' と 'canvheight' を使うのが推奨されます
screen.screensize(canvwidth=800, canvheight=600)
print(f"設定後の描画領域のサイズ: {screen.screensize()}")
# 背景色も設定してみる
screen.bgcolor("lightgray") # setup() でも bgcolor は設定できます
# タートルを動かして、広い領域での描画を試す
# 例えば、中心からかなり離れた場所に移動させてみる
my_turtle.penup() # 線を描かずに移動
my_turtle.goto(350, 250) # 右上の方へ移動 (800x600のキャンバス内で)
my_turtle.pendown() # 線を描く準備
my_turtle.circle(50) # 円を描く
my_turtle.penup()
my_turtle.goto(-350, -250) # 左下の方へ移動
my_turtle.pendown()
my_turtle.dot(20, "blue") # 青い点を描く
turtle.done()
解説:
screen.screensize(canvwidth=800, canvheight=600)
とすることで、タートルが描画できる仮想的なキャンバスのサイズを800x600ピクセルに設定しています。この例では、設定した広いキャンバスの隅の方にタートルを移動させて描画できることを示しています。
注意点: この例では、設定したキャンバスサイズがウィンドウサイズよりも大きい場合、ウィンドウに収まりきらない部分は表示されません。スクロールバーが表示されることもありますが、環境によります。
例3: screensize()
と setup()
の違いを理解する
screensize()
が描画領域のサイズを設定するのに対し、setup()
はウィンドウ自体のサイズを設定します。この違いを理解するための例です。
import turtle
screen = turtle.Screen()
my_turtle = turtle.Turtle()
# ウィンドウの物理的なサイズを600x400に設定
screen.setup(width=600, height=400)
print(f"setup()後のウィンドウサイズ: 幅={screen.window_width()}px, 高さ={screen.window_height()}px")
print(f"setup()後の描画領域サイズ: {screen.screensize()}") # 通常はウィンドウサイズに近くなる
# 描画領域(キャンバス)のサイズを1000x800に設定
# ウィンドウサイズよりも大きく設定してみる
screen.screensize(canvwidth=1000, canvheight=800, bg="lightgreen")
print(f"screensize()設定後の描画領域サイズ: {screen.screensize()}")
# タートルを大きく動かす
my_turtle.penup()
my_turtle.goto(450, 350) # ウィンドウの端を超える座標へ移動
my_turtle.pendown()
my_turtle.circle(100) # 円を描く
# ウィンドウの中心を示すために、小さな円を描く
my_turtle.penup()
my_turtle.goto(0, 0)
my_turtle.dot(10, "red") # 中心に赤い点を打つ
turtle.done()
解説:
screen.setup(width=600, height=400)
で、タートルグラフィックスのウィンドウそのもののサイズを600x400ピクセルに設定します。- その後の
screen.screensize(canvwidth=1000, canvheight=800)
で、タートルが描画できる「仮想的なキャンバス」を1000x800ピクセルに設定しています。 - 結果として、ウィンドウは600x400のままですが、タートルは(-500,-400)から(500,400)の範囲で動き回ることができます。この例では、ウィンドウからはみ出す位置に円を描いて、キャンバスがウィンドウよりも広いことを示しています。
例4: 描画領域をリセットする
screensize()
は引数なしで呼び出すことで、現在のサイズを取得できるだけでなく、特定の値を None
に設定することでリセットに近い動作をさせることも可能です。ただし、通常はデフォルトに戻すというよりは、新しいサイズを設定する用途で使われます。
import turtle
screen = turtle.Screen()
my_turtle = turtle.Turtle()
# 最初は広めに設定
screen.screensize(canvwidth=1000, canvheight=1000, bg="pink")
my_turtle.goto(400, 400)
my_turtle.dot(20, "blue")
print(f"初期設定の描画領域: {screen.screensize()}")
# 少し待つ
turtle.delay(1000) # 1秒待つ
# 描画領域を小さく設定し直す
screen.screensize(canvwidth=600, canvheight=400, bg="lightblue")
my_turtle.home() # タートルを中央に戻す
my_turtle.dot(20, "red")
print(f"再設定後の描画領域: {screen.screensize()}")
turtle.done()
解説: この例では、まず広いキャンバスを設定し、その後でより小さなキャンバスに再設定しています。これにより、描画領域が動的に変更される様子がわかります。タートルは新しいキャンバスの範囲内で相対的に位置を変更します。
-
turtle.setup()
を使用する(最も一般的な代替手段)これは
screensize()
と混同されがちですが、目的が異なります。setup()
は、タートルグラフィックスのウィンドウ自体のサイズと位置を設定します。- 目的: ウィンドウの物理的なサイズを制御したい場合。
- 使い方:
import turtle screen = turtle.Screen() # ウィンドウの幅を800ピクセル、高さを600ピクセルに設定 # デフォルトでは画面中央に配置される screen.setup(width=800, height=600) # ウィンドウの幅、高さ、および開始位置を指定する例 # screen.setup(width=0.75, height=0.5, startx=0, starty=0) # 上記は画面の幅の75%、高さの50%のウィンドウを左上(0,0)に配置 # 数値で指定するとピクセル単位、0.0〜1.0で指定すると画面に対する割合 my_turtle = turtle.Turtle() my_turtle.forward(100) print(f"ウィンドウの物理的サイズ: {screen.window_width()}x{screen.window_height()}px") print(f"描画領域のサイズ(通常はウィンドウサイズに追従): {screen.screensize()}") turtle.done()
screensize()
との違い:setup()
はウィンドウの物理的なサイズを設定し、通常、描画領域(キャンバス)もそのサイズに合わせられます。一方、screensize()
は描画領域の論理的なサイズを設定し、ウィンドウがその描画領域の「ビューポート」として機能します。
-
Tkinter Canvas の設定を直接操作する(より高度な方法)
turtle
モジュールは内部的にTkinter
というGUIライブラリを使用しています。turtle.Screen()
オブジェクトから基になるTkinterのCanvas
オブジェクトを取得し、そのプロパティを直接操作することで、より詳細な制御が可能です。ただし、これはturtle
の抽象化されたレイヤーを越えるため、より高度な知識が必要です。- 目的:
- スクロールバーを明示的に追加したい場合。
- キャンバスのサイズをより低レベルで制御したい場合。
- Tkinterの他のウィジェットと組み合わせたい場合。
- 使い方(例: スクロールバーの追加):
これは複雑な例ですが、
screensize()
では実現が難しいスクロールバーの機能をTkinterを使って実現するアプローチです。import turtle import tkinter as tk # Tkinterのルートウィンドウを作成 root = tk.Tk() root.title("Turtle with Scrollbars") # キャンバスサイズを大きく設定(screensize() で設定するのと似た効果) # このサイズが「仮想的な」描画領域となる canvas_width = 1500 canvas_height = 1000 # TkinterのCanvasを作成し、スクロールバーを付ける canvas_frame = tk.Frame(root) canvas_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # Canvas widget for turtle canvas = tk.Canvas(canvas_frame, width=800, height=600, scrollregion=(0, 0, canvas_width, canvas_height), bg="lightblue") # このCanvasがウィンドウ内の表示領域のサイズ canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # スクロールバーの追加 x_scrollbar = tk.Scrollbar(canvas_frame, orient=tk.HORIZONTAL, command=canvas.xview) x_scrollbar.pack(side=tk.BOTTOM, fill=tk.X) y_scrollbar = tk.Scrollbar(canvas_frame, orient=tk.VERTICAL, command=canvas.yview) y_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) canvas.config(xscrollcommand=x_scrollbar.set, yscrollcommand=y_scrollbar.set) # Tkinter Canvasをturtle Screenに統合 screen = turtle.TurtleScreen(canvas) # Tkinter Canvasを使ってTurtleScreenを初期化 screen.setworldcoordinates(0, canvas_height, canvas_width, 0) # 座標系を設定(任意) my_turtle = turtle.RawTurtle(screen) # RawTurtleを使って、新しいScreenオブジェクトに関連付ける my_turtle.speed(0) # 広い範囲で描画 for _ in range(100): my_turtle.forward(50) my_turtle.left(30) my_turtle.circle(20) my_turtle.forward(20) my_turtle.penup() my_turtle.goto(canvas_width - 100, canvas_height - 100) # 右下の方へ移動 my_turtle.pendown() my_turtle.dot(50, "red") # Tkinterのメインループを開始 root.mainloop()
- 注意点: この方法は
turtle
モジュールの通常のシンプルな使い方からは大きく逸脱します。turtle
は教育用途や簡単なグラフィックス描画のために抽象化されたものです。複雑なGUIやスクロール可能なキャンバスが必要な場合は、Tkinter
やPyQt
、Kivy
など、より本格的なGUIライブラリを直接使用することを検討するのが一般的です。
- 目的:
-
座標系の変更
turtle.setworldcoordinates()
これは直接的なサイズ設定とは異なりますが、描画領域の「見え方」や「スケール」を制御する代替手段です。
- 目的: デフォルトのピクセル単位の座標系ではなく、ユーザー定義の座標系を使いたい場合。例えば、数学のグラフのように(-10,-10)から(10,10)の範囲で描画したい場合など。
- 使い方:
import turtle screen = turtle.Screen() # 描画領域の左下隅を(-100, -100)、右上隅を(100, 100)に設定 # これにより、キャンバスのサイズは変わらないが、座標系の解釈が変わる screen.setworldcoordinates(-100, -100, 100, 100) my_turtle = turtle.Turtle() my_turtle.speed(1) # 新しい座標系で描画 my_turtle.penup() my_turtle.goto(-50, 50) my_turtle.pendown() my_turtle.circle(30) # 半径30の円 my_turtle.penup() my_turtle.goto(0, 0) my_turtle.dot(5, "blue") # 中心に点を打つ turtle.done()
screensize()
との違い:screensize()
はピクセル単位の「広さ」を設定するのに対し、setworldcoordinates()
はその「広さ」にマッピングされる論理的な座標系の範囲を設定します。これにより、ズームイン・ズームアウトのような効果を得ることもできます。
- 座標の解釈を変えたい:
turtle.setworldcoordinates()
を使います。 - 描画領域を非常に大きくし、スクロール可能にしたい:
turtle.screensize()
はそのためのものですが、自動的なスクロールバーの提供は環境に依存します。確実にスクロールバーを実装したい場合は、Tkinterと連携するより高度なプログラミングが必要です。 - ウィンドウの物理的サイズを変えたい:
turtle.setup()
を使います。これがscreensize()
の用途と最も混同されやすい部分です。