Python Turtle: screensize()徹底解説 - 描画領域を自在に操る

2025-06-06

turtle.screensize() の基本的な使い方

この関数は、引数を与えるかどうかで挙動が変わります。

  1. 引数なしで呼び出す場合: 描画領域の現在の幅と高さをピクセル単位で返します。戻り値はタプル (width, height) です。

    例:

    import turtle
    
    screen = turtle.Screen()
    print(screen.screensize())
    # 出力例: (400, 300)  ← デフォルトのサイズは通常400x300ピクセルです
    
  2. 引数を与えて呼び出す場合: 描画領域の幅と高さを設定します。通常、widthheight の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():

    • タートルグラフィックスの ウィンドウ自体のサイズと位置 を設定します。
    • widthheight を指定すると、ウィンドウの物理的なサイズがその値になります。
    • 描画領域のサイズは、通常、ウィンドウのサイズに合わせられます。
  • 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の範囲で動き回ることができます。



  1. 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() を使います。
  2. screensize() を呼び出してもスクロールバーが表示されない screensize() でキャンバスを大きくしても、必ずしもスクロールバーが表示されるとは限りません。

    • 原因: 環境(OS、Pythonのバージョン、Tkinterのバージョンなど)によっては、turtle が自動的にスクロールバーを提供しない場合があります。
    • トラブルシューティング:
      • 通常、turtle.Screen() オブジェクトが持つ getcanvas() メソッドを通じてTkinterの Canvas オブジェクトを取得し、それをスクロールバーと連携させることで実現できますが、これは turtle モジュールの基本的な使い方を超えた高度な操作になります。
      • 多くの場合、スクロールバーが必要になるような広大な描画は、turtle の用途から外れるため、別のグラフィックライブラリ(例: matplotlib, pygame など)の検討も視野に入れると良いでしょう。
  3. 引数の指定ミス(型エラー、引数不足/過多) 関数呼び出しの基本的なエラーです。

    • 原因: screensize()canvwidth, canvheight, bg という引数を期待します。これらを間違った型(例: 数値の代わりに文字列)で渡したり、スペルミスをしたりするとエラーになります。
    • トラブルシューティング:
      • エラーメッセージ(TypeError など)をよく読み、引数の型や数を確認してください。
      • turtle.screensize(width=800, height=600) のように、キーワード引数を使うと、どの値が何を意味するのかが明確になり、間違いを減らせます。
      • 背景色を指定する場合は bg="red" のように文字列で色名を指定するか、(R, G, B) のタプルで指定します。
  4. turtle ウィンドウがすぐに閉じてしまう これは screensize() に直接関連するエラーではありませんが、turtle プログラムでよくある問題です。

    • 原因: プログラムが終了すると、turtle ウィンドウも自動的に閉じます。ユーザーが描画結果を確認する前に閉じてしまうことがあります。
    • トラブルシューティング:
      • プログラムの最後に turtle.done() または screen.mainloop() を追加します。これにより、ユーザーがウィンドウを閉じるまでプログラムが待機します。
      import turtle
      screen = turtle.Screen()
      screen.screensize(800, 600)
      # ... タートルの描画コード ...
      turtle.done() # または screen.mainloop()
      
  5. No module named '_tkinter' エラー これは turtle を使用する上で根本的な問題です。

    • 原因: turtle モジュールは、グラフィックスの表示に Tkinter (Tk interface) というGUIライブラリを使用しています。Pythonのインストール時に Tkinter が含まれていない場合、このエラーが発生します。
    • トラブルシューティング:
      • Pythonをインストールし直す際に、Tkinter のサポートを有効にするオプションを選択します(特にWindowsの場合)。
      • Linux環境では、通常 python3-tk のようなパッケージをインストールする必要があります(例: sudo apt-get install python3-tk)。
  • デバッグプリントを使う: 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()

解説:

  1. screen.setup(width=600, height=400) で、タートルグラフィックスのウィンドウそのもののサイズを600x400ピクセルに設定します。
  2. その後の screen.screensize(canvwidth=1000, canvheight=800) で、タートルが描画できる「仮想的なキャンバス」を1000x800ピクセルに設定しています。
  3. 結果として、ウィンドウは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()

解説: この例では、まず広いキャンバスを設定し、その後でより小さなキャンバスに再設定しています。これにより、描画領域が動的に変更される様子がわかります。タートルは新しいキャンバスの範囲内で相対的に位置を変更します。



  1. 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() は描画領域の論理的なサイズを設定し、ウィンドウがその描画領域の「ビューポート」として機能します。
  2. 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やスクロール可能なキャンバスが必要な場合は、TkinterPyQtKivy など、より本格的なGUIライブラリを直接使用することを検討するのが一般的です。
  3. 座標系の変更 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() の用途と最も混同されやすい部分です。