turtle.mode()
turtle.mode()
の基本的な使い方
turtle.mode(mode=None)
のように使用します。mode
引数に指定できる値は以下の3種類です。
-
'standard' (標準モード):
- これがデフォルトのモードです。
- 画面の中央が (0,0) となります。
- タートルの初期の向きは「東」を向いています(右方向)。
- 角度の指定は反時計回りが正の方向となります。
- 0度: 東
- 90度: 北
- 180度: 西
- 270度: 南
-
'logo' (ロゴモード):
- Logo言語のタートルグラフィックスに互換性のあるモードです。
- 画面の中央が (0,0) となります。
- タートルの初期の向きは「北」を向いています(上方向)。
- 角度の指定は時計回りが正の方向となります。
- 0度: 北
- 90度: 東
- 180度: 南
- 270度: 西
-
'world' (ワールドモード):
- このモードでは、ユーザーが独自の座標系を定義できます。
turtle.setworldcoordinates(llx, lly, urx, ury)
を使用して、画面の左下と右上の座標を指定することで、カスタムの座標系を設定します。- このモードでは、タートルの初期の向きは「東」となります。
具体例
import turtle
# デフォルトは'standard'モードです。
# 最初にタートルを少し動かしてみます。
turtle.forward(100) # 東に100進む
# 'logo'モードに切り替えます
turtle.mode('logo')
# モードを切り替えると、タートルの位置と向きがリセットされます。
# 'logo'モードでは初期の向きが北なので、今度は北に100進みます。
turtle.forward(100)
# 'standard'モードに戻します
turtle.mode('standard')
# 再びリセットされ、初期の向き(東)に戻ります。
turtle.left(90) # 北を向く
turtle.forward(100)
# 'world'モードに切り替えて、カスタム座標系を設定する例
turtle.mode('world')
# 例えば、画面の左下を(-100, -100)、右上を(100, 100)と設定します
turtle.setworldcoordinates(-100, -100, 100, 100)
# このモードでも初期の向きは東です。
turtle.goto(50, 50) # 新しい座標系で(50, 50)へ移動
turtle.done()
- 引数なしの呼び出し:
turtle.mode()
のように引数を指定せずに呼び出すと、現在のタートルモード('standard'、'logo'、または 'world')を文字列で返します。 - タートルのリセット:
mode()
を呼び出すと、タートルの位置と向きがリセットされます。これは、turtle.reset()
を呼び出すのと同じ効果があります。つまり、タートルは画面中央の初期位置に戻り、ペンは下ろされ、デフォルトの色や太さにリセットされます。 - 座標系と向きの定義: タートルがどの方向を0度と認識し、どの向きに進むか、そして座標系の原点と方向を決定します。
ValueError: bad mode name ...
エラーの例
ValueError: bad mode name 'invalid_mode'
原因
turtle.mode()
に無効なモード名('standard'
, 'logo'
, 'world'
以外の文字列)を渡した場合に発生します。例えば、スペルミスや存在しないモード名を指定した場合です。
トラブルシューティング
- モード名の確認: 引数として渡す文字列が
'standard'
、'logo'
、または'world'
のいずれかであることを確認してください。大文字・小文字も区別されますので、正確に記述する必要があります。
モード変更後の挙動の誤解
エラーというよりは「意図しない挙動」
これはエラーメッセージとして表示されるものではありませんが、turtle.mode()
の重要な挙動を理解していないと、コードが期待通りに動作しないことがあります。
- タートルのリセット:
turtle.mode()
を呼び出すと、タートルの位置、向き、ペンの状態(down/up)、色、太さなどがリセットされます。つまり、タートルは画面中央の初期位置に戻り、指定されたモードの初期の向き('standard'
と'world'
は東、'logo'
は北)を向きます。
- 意図しないリセット: プログラムの途中で意図せずにタートルの状態をリセットしたくない場合は、不必要に
turtle.mode()
を呼び出していないか確認してください。 - リセットを考慮する:
turtle.mode()
を呼び出した後、タートルの位置や向きがリセットされていることを念頭に置いて、その後の描画コードを記述してください。もし現在の位置や向きを維持したい場合は、mode()
の呼び出し前にそれらの情報を保存しておき、リセット後に再度設定し直す必要があります。
worldモードでの座標系の未設定
エラーの例(直接のエラーではなく、描画の問題)
turtle.mode('world')
を呼び出した後、turtle.setworldcoordinates()
を呼び出していない場合、描画が画面に表示されない、または予期しないスケールで表示されることがあります。
'world'
モードはカスタム座標系を前提としていますが、その座標系の具体的な範囲をturtle.setworldcoordinates(llx, lly, urx, ury)
で指定しないと、タートルはその座標系をどのように解釈して描画すればよいか分かりません。
setworldcoordinates
の呼び出し:turtle.mode('world')
を呼び出した直後に、必ずturtle.setworldcoordinates(llx, lly, urx, ury)
を呼び出して、左下と右上の座標を設定してください。
例:
import turtle
# 'world'モードに設定
turtle.mode('world')
# !!! ここで setworldcoordinates を呼び出す必要がある !!!
# 例: 画面の左下を(-200, -200)、右上を(200, 200)とする
turtle.setworldcoordinates(-200, -200, 200, 200)
turtle.forward(100) # 新しい座標系で100単位進む
turtle.goto(50, 50) # 新しい座標系で(50, 50)へ移動
turtle.done()
turtleモジュールのインポートに関する問題
NameError: name 'turtle' is not defined
または
AttributeError: module 'turtle' has no attribute 'mode'
- ファイル名が
turtle.py
になっているなど、標準ライブラリのturtle
モジュールと名前が競合している。 import turtle
を忘れているか、間違った方法でインポートしている。
- ファイル名の競合: 実行しているPythonスクリプトの名前が
turtle.py
になっていないか確認してください。もしそうであれば、Pythonは標準ライブラリのturtle
ではなく、そのファイルをインポートしようとします。ファイル名をmy_drawing.py
など別の名前に変更してください。 - 正しいインポート: コードの先頭で
import turtle
と記述していることを確認してください。もしfrom turtle import *
を使用している場合は、mode()
を直接mode('standard')
のように呼び出せます。
- インタラクティブシェルで試す: Pythonのインタラクティブシェル(REPL)で
turtle.mode()
を単独で実行してみて、その挙動を確認するのも有効です。 - シンプルなコードで試す: 問題が発生している部分だけを切り出し、非常にシンプルなコードで再現を試みてください。これにより、他の複雑なコードの影響を排除できます。
- エラーメッセージを読む: Pythonのエラーメッセージ(Traceback)は非常に詳細です。どのファイル、どの行で、どのような種類のエラーが発生したかを確認し、それに基づいて原因を特定します。
'world'
(ワールド): ユーザーが独自の座標系を設定できます。'logo'
(ロゴ): Logo言語と互換性があります。0度が北(上)を向き、時計回りが正の角度。'standard'
(標準): デフォルトのモード。0度が東(右)を向き、反時計回りが正の角度。
デフォルトのモード ('standard') の確認と描画
turtle.mode()
を引数なしで呼び出すと、現在のモードが返されます。デフォルトは'standard'
です。
import turtle
# 現在のモードを確認(デフォルトは'standard')
print(f"現在のモード: {turtle.mode()}") # 出力例: 現在のモード: standard
# 'standard'モードでの描画
# 初期位置は中央(0,0)、初期の向きは東(右)
turtle.forward(100) # 東に100ピクセル進む
turtle.left(90) # 左に90度回転(北を向く)
turtle.forward(100) # 北に100ピクセル進む
turtle.done() # ウィンドウを閉じるまで待機
実行結果
- タートルが右に100ピクセル線を引き、次に上へ100ピクセル線を描画します。
'logo'モードでの描画
'logo'
モードに切り替えると、タートルの初期の向きが北(上)に変わり、角度の回転方向も時計回りが正になります。turtle.mode()
を呼び出すと、タートルの位置と向きがリセットされる点に注意してください。
import turtle
# 最初に少し描画してみる(standardモード)
turtle.pensize(3)
turtle.pencolor("blue")
turtle.forward(100)
turtle.write("Standard Mode", align="center", font=("Arial", 10, "normal"))
# 'logo'モードに切り替える
# これによりタートルはリセットされ、初期位置(0,0)で北向きになります
turtle.mode('logo')
print(f"現在のモード: {turtle.mode()}") # 出力例: 現在のモード: logo
# 'logo'モードでの描画
turtle.penup() # ペンを上げる
turtle.goto(0, 50) # (0,50)に移動
turtle.pendown() # ペンを下ろす
turtle.pencolor("red")
turtle.forward(100) # 北に100ピクセル進む
turtle.right(90) # 右に90度回転(東を向く)
turtle.forward(100) # 東に100ピクセル進む
turtle.write("Logo Mode", align="center", font=("Arial", 10, "normal"))
turtle.done()
実行結果
- 青い線で「Standard Mode」と書かれた線が右と上に描画されます。
- ウィンドウがリセットされ、タートルが中央に移動し、北向きになります。
- 赤い線で「Logo Mode」と書かれた線が上と右に描画されます。
'world'モードでのカスタム座標系
'world'
モードでは、turtle.setworldcoordinates(llx, lly, urx, ury)
を使用して、画面の左下(llx
, lly
)と右上(urx
, ury
)の座標を自由に定義できます。これにより、描画領域を特定の論理的な座標空間にマッピングできます。
import turtle
# 'world'モードに切り替える
# これによりタートルはリセットされます
turtle.mode('world')
print(f"現在のモード: {turtle.mode()}") # 出力例: 現在のモード: world
# 独自の座標系を設定
# 例: 画面の左下を(-10, -10)、右上を(10, 10)とする
turtle.setworldcoordinates(-10, -10, 10, 10)
# 'world'モードでの描画
# 初期位置は(0,0)、初期の向きは東(右)
turtle.pensize(2)
turtle.pencolor("green")
# (0,0)から(5,5)へ移動
turtle.penup()
turtle.goto(0, 0)
turtle.pendown()
turtle.goto(5, 5)
# (5,5)から(5,-5)へ移動
turtle.pencolor("purple")
turtle.goto(5, -5)
# テキストの表示 (新しい座標系で)
turtle.penup()
turtle.goto(-8, 8)
turtle.pendown()
turtle.write("World Mode (Custom Coords)", align="left", font=("Arial", 1, "normal")) # フォントサイズもワールド座標に影響される
turtle.done()
- ウィンドウがリセットされます。
- 画面全体が-10から10の範囲の座標系として扱われます。
- 緑色の線が(0,0)から(5,5)へ、紫色の線が(5,5)から(5,-5)へと描画されます。
- 左上に「World Mode (Custom Coords)」というテキストが表示されます。フォントサイズも相対的に調整されます。
'world'
モードでは、setworldcoordinates()
を呼び出すことが必須です。呼び出さないと、タートルは画面の表示範囲を正しく計算できず、描画がうまくいかない可能性があります。turtle.mode()
を呼び出すと、タートルの状態がリセットされます。これは、turtle.reset()
を呼び出すのと同じ効果です。もし現在の描画状態を維持したい場合は、mode()
の呼び出しを避け、他の方法(例:setheading()
やgoto()
)で向きや位置を調整することを検討してください。
Pythonのturtle.mode()
は、タートルの座標系と初期の向きを制御するための強力な関数ですが、代替手段というよりは、turtle.mode()
を使わずに同様の効果や特定の描画制御を実現する方法と考えるのが適切です。
turtle.mode()
が提供する主な機能は以下の2点です。
- 座標系と角度の基準設定:
'standard'
、'logo'
、'world'
の各モードで、0度の方向や角度の増減方向、そして'world'
モードではカスタム座標系を設定します。 - タートルのリセット:
mode()
を呼び出すと、タートルの位置、向き、ペンの状態などがリセットされます。
これらの機能について、mode()
を使わずに実現する方法を説明します。
座標系と角度の基準設定の代替
turtle.mode()
を使わずに、デフォルトの'standard'
モードを前提としつつ、タートルの向きや位置を制御する方法です。
a. 初期位置の変更: turtle.setx()
, turtle.sety()
, turtle.goto()
turtle.mode()
はタートルを中央(0,0)にリセットしますが、goto()
などを使えば好きな位置に移動できます。
import turtle
# turtle.mode() を使わない(デフォルトの'standard'モード)
# タートルを初期位置(0,0)から右に移動
turtle.penup() # 線を描かずに移動
turtle.goto(50, 0) # X座標を50、Y座標を0に移動
turtle.pendown() # 線を描き始める
turtle.circle(30) # 円を描く
turtle.done()
b. 初期向きの変更: turtle.setheading()
, turtle.left()
, turtle.right()
'standard'
モードの0度が東であることを利用し、setheading()
などで好きな向きに設定できます。
import turtle
# turtle.mode() を使わない(デフォルトの'standard'モード)
# 初期向きは東(0度)
turtle.forward(50) # 東に50進む
# 'logo'モードの初期向き(北=90度)を模倣
turtle.setheading(90) # 向きを90度(北)に設定
turtle.forward(50) # 北に50進む
# 'logo'モードの角度計算(時計回りが正)を模倣
# 北(90度)から時計回りに90度回転させるには、setheading()で0度にする
turtle.setheading(0) # 東を向く
turtle.forward(50) # 東に50進む
turtle.done()
c. world
モードの代替: turtle.setworldcoordinates()
'world'
モードは、実質的にsetworldcoordinates()
の呼び出しとタートルのリセットを組み合わせたものです。したがって、'standard'
モードのままsetworldcoordinates()
を呼び出すことで、カスタム座標系を利用できます。
import turtle
# turtle.mode('world') を使わないが、world座標系を設定する
# デフォルトの'standard'モードのまま、setworldcoordinates()を呼び出す
turtle.setworldcoordinates(-100, -100, 100, 100)
# この時点でタートルはリセットされていない(重要!)
# 必要であれば、手動でリセットする
# turtle.reset()
# カスタム座標系での描画
turtle.goto(50, 50) # 新しい座標系で(50,50)へ移動
turtle.dot(10, "red") # 赤い点を描画
turtle.done()
注意点: turtle.mode('world')
と異なり、turtle.setworldcoordinates()
だけではタートルの位置や向きはリセットされません。したがって、描画前にタートルの状態を初期化したい場合は、明示的にturtle.reset()
を呼び出す必要があります。
turtle.mode()
が自動的に行うタートルのリセットは、turtle.reset()
またはturtle.clear() + turtle.home()
で代替できます。
a. turtle.reset()
画面を消去し、タートルを初期状態(中央、東向き、ペンダウン、デフォルトの太さと色)に戻します。turtle.mode()
が内部的に行っているリセットとほぼ同じです。
import turtle
turtle.forward(100) # 線を描く
# turtle.mode() の代わりに reset() を使う
turtle.reset() # 画面をクリアし、タートルを初期状態に戻す
turtle.left(90) # 北を向く
turtle.forward(50) # 北に50進む
turtle.done()
b. turtle.clear()
と turtle.home()
turtle.clear()
は画面から描画だけを消去しますが、タートルの位置や向きはそのままです。
turtle.home()
はタートルを中央(0,0)に移動させ、向きを0度(東)に設定します。
これらを組み合わせることで、reset()
に近い効果が得られます。
import turtle
turtle.pensize(5)
turtle.forward(100) # 太い線を描く
# turtle.mode() の代わりに clear() と home() を使う
turtle.clear() # 描画のみ消去、タートルの状態はそのまま
turtle.home() # タートルを中央(0,0)に移動し、0度(東)に向ける
turtle.pencolor("blue")
turtle.circle(40) # 青い円を描く
turtle.done()
turtle.mode()
は特定の描画モードを一括で設定し、タートルの状態をリセットする便利な関数です。しかし、その機能は他の個別のturtle
関数(setheading()
, goto()
, setworldcoordinates()
, reset()
, home()
など)を組み合わせることで、よりきめ細かく制御することも可能です。
どちらの方法を選ぶかは、プログラムの意図によります。
- 描画を消去し、タートルを初期状態に戻したい場合:
turtle.reset()
が便利です。 - 既存の描画状態を維持しつつ一部のパラメータだけを変更したい場合:
setheading()
,goto()
,setworldcoordinates()
などの個別の関数を使う方が適しています。 - 簡単なモード切り替えと完全なリセットが必要な場合:
turtle.mode()
が最も簡潔で分かりやすいです。