Python Turtleで始めるグラフィックプログラミング:window_width()活用例

2025-06-06

Pythonのturtleモジュールにおけるturtle.window_width()は、タートルグラフィックスが表示されるウィンドウの幅をピクセル単位で返す関数です。



NameError: name 'turtle' is not defined または AttributeError: module 'turtle' has no attribute 'window_width'

原因
turtleモジュールが正しくインポートされていないか、window_width()を呼び出すオブジェクトが間違っている場合に発生します。

対処法

  • Screen オブジェクトの使用
    window_width()は、turtle.Screen()によって作成されるスクリーンオブジェクトのメソッドです。直接 turtle.window_width() と呼び出すのではなく、以下のようにスクリーンオブジェクトを介して呼び出す必要があります。
  • import turtle を確認
    スクリプトの冒頭で必ず import turtle を行っていることを確認してください。
import turtle

screen = turtle.Screen() # スクリーンオブジェクトを作成
width = screen.window_width() # スクリーンオブジェクトのメソッドとして呼び出す
print(f"ウィンドウの幅: {width} ピクセル")

turtle.done() # ウィンドウを閉じずに保持

ウィンドウがすぐに閉じてしまい、幅を確認できない

原因
スクリプトが最後まで実行されると、タートルグラフィックスのウィンドウは自動的に閉じられてしまいます。特に、インタラクティブシェルではなくスクリプトとして実行する場合によく発生します。

対処法

  • turtle.done() または turtle.mainloop() を使う
    スクリプトの最後に turtle.done() または turtle.mainloop() を追加することで、ウィンドウが開いたままになり、ユーザーが手動で閉じるまでプログラムが終了しなくなります。
import turtle

screen = turtle.Screen()
width = screen.window_width()
print(f"ウィンドウの幅: {width} ピクセル")

# ウィンドウが閉じないようにする
turtle.done()

予期しないウィンドウサイズが返される

原因

  • 初期化直後
    turtle.Screen()でスクリーンオブジェクトを作成した直後では、まだウィンドウのサイズが確定していない(デフォルトサイズの場合)ことがあります。setup()などで明示的にサイズを設定した後に取得するのが確実です。
  • ウィンドウのリサイズ
    ユーザーが手動でウィンドウのサイズを変更した場合、window_width()を再度呼び出すまでは古い値が返されます。

対処法

  • screen.setup()で明示的にサイズを設定する
    もし特定のサイズのウィンドウで作業したいのであれば、screen.setup(width, height)を使って初期サイズを設定し、その後でwindow_width()を呼び出すことで、期待する値が得られます。
import turtle

screen = turtle.Screen()
screen.setup(width=800, height=600) # 幅800、高さ600に設定

width = screen.window_width()
print(f"設定後のウィンドウの幅: {width} ピクセル")

turtle.done()
  • イベントドリブンプログラミング
    ウィンドウのサイズ変更イベントを捕捉して、そのたびにwindow_width()を呼び出すようにすることも可能ですが、これはより高度な使い方になります。

_tkinter モジュールが見つからないエラー (No module named '_tkinter')

原因
turtleモジュールは、グラフィカルインターフェースの描画に Tkinter (Pythonの標準GUIライブラリ) を利用しています。Pythonのインストールによっては、Tkinterが同梱されていない場合があります。

対処法

  • Tkinter のインストール
    • Windows / macOS
      通常のPythonのインストールではTkinterが含まれていますが、もし含まれていない場合はPythonの公式インストーラを再度実行し、「Tcl/Tk and IDLE」のオプションを有効にしてインストールし直してください。
    • Linux
      ディストリビューションによって異なりますが、一般的にはパッケージマネージャーを使ってpython3-tktkinterといったパッケージをインストールします。
      • Debian/Ubuntu系: sudo apt-get install python3-tk
      • Fedora系: sudo dnf install python3-tkinter

原因
window_width()は整数を返しますが、誤って文字列として扱おうとしたり、数値演算を行わない場合にロジックエラーになることがあります。

  • 戻り値は整数なので、そのまま数値として利用できます。計算に使用する際は型変換の必要はありません。
import turtle

screen = turtle.Screen()
width = screen.window_width()

# ウィンドウの幅の半分を計算して利用する
half_width = width / 2
print(f"ウィンドウの幅の半分: {half_width} ピクセル")

turtle.done()


例1: ウィンドウの幅を表示する基本的なコード

このコードは、タートルグラフィックスのウィンドウを作成し、その幅を取得してコンソールに表示します。

import turtle

# スクリーンオブジェクトを作成
screen = turtle.Screen()

# ウィンドウの幅を取得
window_width = screen.window_width()

# 取得した幅を表示
print(f"現在のウィンドウの幅: {window_width} ピクセル")

# ウィンドウがすぐに閉じないようにする(ユーザーが閉じるまで待機)
turtle.done()

説明

  1. import turtle: turtleモジュールをインポートします。
  2. screen = turtle.Screen(): タートルグラフィックスの描画領域であるスクリーン(ウィンドウ)のオブジェクトを作成します。window_width()はこのScreenオブジェクトのメソッドです。
  3. window_width = screen.window_width(): screenオブジェクトのwindow_width()メソッドを呼び出し、現在のウィンドウの幅をピクセル単位で取得してwindow_width変数に格納します。
  4. print(...): 取得した幅をコンソールに表示します。
  5. turtle.done(): これがないと、スクリプトが終了すると同時にウィンドウも閉じてしまいます。この行があることで、ユーザーが手動でウィンドウを閉じるまでプログラムが待機します。

例2: ウィンドウの幅に基づいてタートルを移動させる

この例では、ウィンドウの幅を取得し、その値を使ってタートルをウィンドウの右端(に近い位置)まで移動させます。

import turtle

# スクリーンオブジェクトを作成
screen = turtle.Screen()
screen.setup(width=600, height=400) # 初期ウィンドウサイズを設定

# タートルオブジェクトを作成
t = turtle.Turtle()
t.speed(3) # タートルの速度を設定

# ペンを上げて(描画せずに)移動開始
t.penup()

# ウィンドウの幅を取得
window_width = screen.window_width()

# ウィンドウの中心が(0,0)なので、右端は width / 2 になる
# 少し余裕を持たせて、右端から20ピクセル内側に移動する
target_x = (window_width / 2) - 20

# タートルを目標位置に移動
t.goto(target_x, 0)

# ペンを下ろして描画開始
t.pendown()

# 短い線を描いて、停止したことを示す
t.forward(10)

# ウィンドウが閉じないようにする
turtle.done()

説明

  1. screen.setup(width=600, height=400): ウィンドウの初期サイズを明示的に設定しています。これにより、window_width()を呼び出す前にウィンドウサイズが確定します。
  2. t.penup(): タートルが移動する際に線を描かないようにペンを上げます。
  3. window_width = screen.window_width(): 現在のウィンドウの幅を取得します。
  4. target_x = (window_width / 2) - 20: タートルグラフィックスの座標系では、ウィンドウの中心が(0, 0)です。そのため、ウィンドウの右端のX座標はwindow_width / 2になります。ここでは、右端から20ピクセル内側に移動するように計算しています。
  5. t.goto(target_x, 0): 計算したX座標とY座標0(中央の高さ)にタートルを移動させます。
  6. t.pendown(): 移動後にペンを下ろし、続くt.forward(10)で短い線を描きます。

この例は少し高度ですが、ウィンドウのサイズが変更されたときにwindow_width()を再取得し、新しい幅を表示する方法を示します。これはonresizeイベントハンドラを使用します。

import turtle

# スクリーンオブジェクトを作成
screen = turtle.Screen()
screen.setup(width=800, height=600) # 初期ウィンドウサイズを設定

# タートルオブジェクトを作成(ここでは描画しないが、必要なら追加)
t = turtle.Turtle()
t.hideturtle() # タートルアイコンを隠す

def show_current_width():
    """
    現在のウィンドウ幅を取得し、タイトルバーに表示する関数
    """
    current_width = screen.window_width()
    screen.title(f"ウィンドウの幅: {current_width} ピクセル")
    print(f"ウィンドウの幅が変更されました: {current_width} ピクセル")

# ウィンドウの初期幅を表示
show_current_width()

# ウィンドウサイズ変更イベントに関数を登録
# onresize() は Tkinter のイベントハンドラに依存するため、
# ここでは onkeypress や ontimer とは異なるアプローチをとります。
# 実際には、Tkinterの内部メカニズムを利用してウィンドウのリサイズイベントを捕捉する必要があります。
# turtleモジュール自体には、直接的な onresize() メソッドはありません。
# しかし、Tkinterのルートウィンドウを取得してイベントバインドすることで実現できます。

# Tkinterのルートウィンドウを取得
root = screen._root

# <Configure> イベントは、ウィンドウの位置やサイズが変更されたときに発生
def on_window_configure(event):
    if event.widget == root: # イベントがルートウィンドウからのものであることを確認
        show_current_width()

root.bind("<Configure>", on_window_configure)


# ウィンドウが閉じないようにする
turtle.done()
  1. screen.setup(...): 初期ウィンドウサイズを設定します。
  2. show_current_width()関数:
    • screen.window_width()で現在のウィンドウ幅を取得します。
    • screen.title(...): ウィンドウのタイトルバーに現在の幅を表示します。
    • print(...): コンソールにも幅を表示します。
  3. root = screen._root: turtleモジュールのScreenオブジェクトは、内部的にTkinterのTk(ルートウィンドウ)オブジェクトを持っています。_root属性でこれにアクセスします。注意: _で始まる属性は内部的なものなので、将来のバージョンで変更される可能性があります。
  4. root.bind("<Configure>", on_window_configure): Tkinterのbindメソッドを使って、ルートウィンドウに<Configure>イベントのハンドラを登録します。
    • <Configure>イベントは、ウィンドウのサイズ、位置、スタック順序などが変更されたときに発生します。
    • on_window_configure関数は、このイベントが発生するたびに呼び出されます。
    • if event.widget == root:: イベントがルートウィンドウから発生したものであることを確認します。これにより、ウィンドウ内の他のウィジェットからの<Configure>イベントとの混同を防ぎます。
  5. このコードを実行し、ウィンドウのサイズを手動で変更すると、タイトルバーの表示とコンソールの出力がリアルタイムで更新されるのが確認できます。


screen.screensize() は、タートルが描画できる「キャンバス」のサイズ(論理的なサイズ)を返します。これは、ウィンドウの物理的なサイズとは異なる場合があることに注意が必要です。