turtle.goto()

2025-06-06

Pythonのturtleモジュールにおけるturtle.goto()(またはturtle.setpos()turtle.setposition())は、タートルを指定されたX, Y座標に移動させるための関数です。

概念

turtleモジュールは、画面上に「タートル」(カメの形をしたカーソル)を動かして絵を描くことができるグラフィックスライブラリです。タートルはペンを持っており、動くと線を引きます。

画面はX, Y座標系で表され、通常は中心が(0, 0)となります。

turtle.goto()の働き

turtle.goto(x, y)関数は、タートルを現在の位置から、引数として指定されたx座標とy座標へ直線的に移動させます。

  • 線を引くかどうか
    • 通常、turtle.goto()を実行すると、移動する経路に線が描画されます
    • 線を引かずに移動したい場合は、turtle.penup()でペンを上げてからturtle.goto()を実行し、移動後にturtle.pendown()でペンを下ろす必要があります。

引数

  • y: 移動先のY座標。数値(整数または浮動小数点数)で指定します。
  • x: 移動先のX座標。数値(整数または浮動小数点数)で指定します。
import turtle

# タートルオブジェクトを作成
t = turtle.Turtle()

# 描画速度を速くする(オプション)
t.speed(0)

# 初期位置から(100, 50)へ移動しながら線を引く
t.goto(100, 50)

# ペンを上げて、線を引かずに移動する
t.penup()
t.goto(-100, -50)

# ペンを下ろして、再び線を引く準備をする
t.pendown()

# (-100, -50)から(0, 100)へ移動しながら線を引く
t.goto(0, 100)

# 画面がすぐに閉じないようにする
turtle.done()


AttributeError: 'module' object has no attribute 'goto' または 'Turtle' object has no attribute 'goto'

これは最も一般的なエラーの一つです。

原因

  • 大文字小文字の間違い
    Pythonは大文字と小文字を区別します。turtle.Turtle()のように、クラス名は大文字で始まる必要があります。
  • ファイル名がturtle.pyになっている
    自分のPythonスクリプトのファイル名をturtle.pyにしてしまうと、Pythonは標準ライブラリのturtleモジュールではなく、自分のファイルを参照しようとします。その結果、必要な関数が見つからずにエラーになります。
  • タートルインスタンスを作成していない
    turtle.goto()は、turtleモジュールそのものではなく、タートルオブジェクトのメソッドです。つまり、タートルを動かす前に、まずタートルのインスタンスを作成する必要があります。

トラブルシューティング

  • 大文字小文字の確認
    turtle.Turtle()のように、Turtleが大文字で始まっていることを確認してください。
  • ファイル名の変更
    自分のPythonスクリプトのファイル名がturtle.pyになっていないか確認し、もしそうであれば、例えばmy_drawing.pyのように別の名前に変更してください。
  • タートルインスタンスの作成
    import turtle
    
    # タートルインスタンスを作成する
    t = turtle.Turtle() 
    
    t.goto(100, 100) # これで正しく動く
    
    turtle.goto(100, 100)のように直接モジュールの関数を呼び出そうとするとエラーになります。

TypeError: goto() missing 2 required positional arguments: 'x' and 'y'

これは引数の渡し方に関するエラーです。

原因

  • 引数として文字列を渡してしまっている(例: t.goto("100", "50"))。座標は数値である必要があります。
  • goto()関数は、移動先のX座標とY座標の2つの引数を受け取りますが、それらが指定されていないか、正しくない形式で渡されています。

トラブルシューティング

  • タプルで渡す場合
    もし座標をタプルで持っている場合、*を使ってアンパックして渡すことができます。
    coords = (100, 50)
    t.goto(*coords) # coords = (100, 50) の場合、t.goto(100, 50) と同じ意味になる
    
  • X, Y座標を数値で指定
    t = turtle.Turtle()
    t.goto(100, 50) # 正しい
    # t.goto("100", "50") # 間違い (文字列はNG)
    # t.goto(100) # 間違い (y座標が足りない)
    

NameError: name 'turtle' is not defined

これは、turtleモジュールが正しくインポートされていない場合に発生します。

原因

  • スペルミスがある(例: turtule)。
  • import turtleをスクリプトの先頭に書いていない。

トラブルシューティング

  • import turtleの確認
    import turtle # これを忘れずに!
    
    t = turtle.Turtle()
    t.goto(100, 100)
    

タートルが動かない、または画面が表示されない

これはエラーメッセージが出ないものの、期待する動作がされないケースです。

原因

  • タートルが非表示になっている
    turtle.hideturtle()などでタートルが非表示になっている場合、線は引かれますが、タートル自体は見えません。
  • タートルが速すぎる
    タートルが非常に速く動く設定になっていると、動きが一瞬で終わってしまい、動いていないように見えることがあります。
  • プログラムがすぐに終了してしまう
    turtleグラフィックスは、通常、プログラムが終了すると同時にウィンドウも閉じます。コードが実行された直後にウィンドウが閉じてしまうと、タートルが動くのを確認できません。

トラブルシューティング

  • タートルを表示する
    t = turtle.Turtle()
    t.showturtle() # タートルが表示されていることを確認
    t.goto(100, 100)
    turtle.done()
    
  • 速度の調整
    t = turtle.Turtle()
    t.speed(1) # 1 (遅い) から 10 (速い) または 0 (最速、アニメーションなし)
    t.goto(100, 100)
    turtle.done()
    
    t.speed()を使ってタートルの描画速度を調整できます。
  • 画面を維持するコードを追加
    import turtle
    
    t = turtle.Turtle()
    t.goto(100, 100)
    
    # 画面が閉じないようにする
    turtle.done() # または turtle.mainloop()
    
    turtle.done()turtle.mainloop()は、画面を閉じずにイベントループを維持します。これにより、ユーザーが手動でウィンドウを閉じるまで表示され続けます。

これは、turtleグラフィックスが内部で使用しているTkinterというGUIライブラリに関連するエラーです。

原因

  • 他のGUIライブラリと競合している。
  • 既に閉じられたウィンドウに対して、タートル操作を行おうとしている。
  • turtle.done()turtle.mainloop()が複数回呼び出されている。
  • ウィンドウが閉じられていないか確認
    ユーザーがウィンドウを閉じた後に、さらにタートルを操作しようとするとこのエラーが発生することがあります。
  • turtle.done()は一度だけ呼び出す
    プログラムの最後に一度だけ呼び出すようにしてください。
  • IDE (統合開発環境) やエディタの活用
    VS CodeなどのIDEは、構文エラーをリアルタイムで強調表示したり、デバッグをサポートしたりする機能があり、エラーの早期発見に役立ちます。
  • Pythonのバージョンを確認
    稀に、Pythonのバージョンによって挙動が異なる場合があります。
  • コードをシンプルにする
    問題を特定するために、疑わしい部分をコメントアウトしたり、コードを最小限に減らしてテストしたりしてください。
  • エラーメッセージをよく読む
    Pythonのエラーメッセージは、問題の原因と場所を示す非常に役立つ情報源です。特に、Traceback (most recent call last)の最後の行に注目してください。


例1: 基本的な移動と線の描画

最も基本的なgoto()の使い方は、タートルを特定の座標に移動させて線を引くことです。

import turtle

# 1. スクリーンオブジェクトとタートルオブジェクトを作成
screen = turtle.Screen() # スクリーンオブジェクト
t = turtle.Turtle()     # タートルオブジェクト

# 2. タートルの初期設定(オプション)
t.shape("turtle") # タートルの形をカメにする
t.color("blue")   # タートルの色を青にする
t.speed(1)        # 描画速度を遅めに設定(アニメーションを確認しやすい)

# 3. goto()を使って移動し、線を引く

# 初期位置 (0, 0) から (100, 100) へ移動
print("初期位置から (100, 100) へ移動します。")
t.goto(100, 100)

# (100, 100) から (-100, 100) へ移動
print("(100, 100) から (-100, 100) へ移動します。")
t.goto(-100, 100)

# (-100, 100) から (-100, -100) へ移動
print("(-100, 100) から (-100, -100) へ移動します。")
t.goto(-100, -100)

# (-100, -100) から (0, 0) へ移動(中心に戻る)
print("(-100, -100) から (0, 0) へ移動します。")
t.goto(0, 0)

# 4. 描画終了後、画面がすぐに閉じないようにする
screen.mainloop() # または turtle.done()
print("描画が完了しました。")

解説

  • タートルが移動する間、ペンが下がっているため、経路に線が描画されます。
  • t.goto(x, y)は、タートルを現在の位置から引数で指定された(x, y)座標へ直線的に移動させます。

例2: 線を引かずに移動する (penup()pendown())

goto()はデフォルトで線を引きますが、線を引かずに移動したい場合はpenup()pendown()を使います。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(3) # 少し速く

# 1. 最初の四角形を描く
t.goto(50, 50)
t.goto(-50, 50)
t.goto(-50, -50)
t.goto(50, -50)
t.goto(50, 50) # 四角形を閉じる

# 2. ペンを上げて、線を引かずに移動
print("ペンを上げて移動します。")
t.penup() # ペンを上げる

# 線を引かずに新しい開始位置へ移動
t.goto(150, 0) 

# 3. ペンを下ろして、新しい場所から描画を再開
print("ペンを下ろして、新しい四角形を描きます。")
t.pendown() # ペンを下ろす

# 新しい位置から別の四角形を描く
t.goto(200, 50)
t.goto(100, 50)
t.goto(100, -50)
t.goto(200, -50)
t.goto(200, 50) # 四角形を閉じる

screen.mainloop()

解説

  • このテクニックは、図形の間に空白を作ったり、複数の離れた図形を描いたりする際に非常に重要です。
  • t.pendown(): タートルのペンを下ろします。これ以降の移動では線が描画されます。
  • t.penup(): タートルのペンを上げます。これ以降のt.goto()t.forward()などの移動では線が描画されません。

例3: 複数の点を指定して多角形を描く

goto()を使って、あらかじめ定義された点のリストを巡回することで、複雑な多角形を描くことができます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1)
t.pensize(2) # ペンの太さを設定

# 描画したい点のリスト
# 例:五角形の座標
points = [
    (0, 100),       # 上
    (95, 30),       # 右上
    (58, -80),      # 右下
    (-58, -80),     # 左下
    (-95, 30)       # 左上
]

# 最初の点に移動(線を引かずに)
t.penup()
t.goto(points[0])
t.pendown()

# リストの各点を巡回して線を描く
print("多角形を描画します。")
for x, y in points:
    t.goto(x, y)

# 最初の点に戻って多角形を閉じる
t.goto(points[0])

screen.mainloop()

解説

  • 最初の点へはpenup()で移動し、pendown()してから描き始めることで、原点から最初の点までの余分な線が描かれるのを防ぎます。
  • 座標のリストを定義し、ループを使って各点へgoto()します。

例4: goto() とイベントハンドリング(クリックで移動)

goto()は、ユーザーの入力(例えばマウスのクリック)と組み合わせることで、インタラクティブなプログラムを作成できます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.shape("circle") # タートルの形を丸にする
t.color("red")
t.speed(0) # 最速で移動(アニメーションなし)
t.penup() # 初期設定でペンを上げておく

# クリックイベントが発生したときに実行される関数
def move_turtle_to_click(x, y):
    print(f"クリックされた座標: ({x}, {y})")
    t.goto(x, y) # クリックされた座標へタートルを移動

# スクリーンをクリックイベントを登録
screen.onclick(move_turtle_to_click)

print("画面をクリックしてください。タートルがクリックされた場所へ移動します。")

screen.mainloop()

解説

  • この例では、goto()を使って、クリックされた場所にタートルを即座に移動させています。
  • イベントハンドラの関数(ここではmove_turtle_to_click)は、クリックされたX, Y座標を自動的に引数として受け取ります。
  • screen.onclick(関数名)は、スクリーンがクリックされたときに指定された関数を呼び出すように設定します。

begin_fill()end_fill()goto()と組み合わせることで、閉じた図形を塗りつぶすことができます。

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1)

t.color("black", "lightgreen") # ペン色を黒、塗りつぶし色を薄緑に設定

print("塗りつぶされた三角形を描画します。")
t.begin_fill() # 塗りつぶしの開始

# 三角形の頂点へgoto()で移動
t.goto(0, 100)
t.goto(100, 0)
t.goto(-100, 0)
t.goto(0, 100) # 閉じた図形にするために、開始点に戻る

t.end_fill() # 塗りつぶしの終了

screen.mainloop()
  • goto()を使って図形の各頂点を結ぶことで、閉じた図形が描かれ、それが塗りつぶされます。
  • t.end_fill(): 塗りつぶしを終了する合図です。begin_fill()以降に描かれた閉じられた図形が、t.color()で設定された塗りつぶし色で塗られます。
  • t.begin_fill(): 塗りつぶしを開始する合図です。


主な代替メソッドをいくつかご紹介します。

turtle.forward(distance) / turtle.fd(distance) (前進)

タートルが現在向いている方向に、指定された距離だけ前進します。最も頻繁に使われる移動メソッドの一つです。

  • distance: 移動する距離(ピクセル単位)。正の値は前進、負の値は後退します。


import turtle
t = turtle.Turtle()
t.speed(1)

t.forward(100) # 100ピクセル前進
t.left(90)     # 左に90度回転
t.fd(50)       # 50ピクセル前進(fdはforwardの省略形)

turtle.done()

turtle.backward(distance) / turtle.bk(distance) / turtle.back(distance) (後退)

タートルが現在向いている方向とは逆方向に、指定された距離だけ後退します。

  • distance: 移動する距離(ピクセル単位)。


import turtle
t = turtle.Turtle()
t.speed(1)

t.forward(100)
t.backward(50) # 50ピクセル後退

turtle.done()

turtle.setx(x) / turtle.sety(y) (X座標またはY座標の設定)

タートルのX座標またはY座標を直接設定します。もう一方の座標は変化しません。これにより、水平または垂直な移動が可能です。

  • y: 設定する新しいY座標。
  • x: 設定する新しいX座標。


import turtle
t = turtle.Turtle()
t.speed(1)

t.penup()
t.goto(50, 50) # まず特定の場所に移動
t.pendown()

t.setx(100)    # Y座標は50のまま、X座標を100にする (右に移動)
t.sety(-50)    # X座標は100のまま、Y座標を-50にする (下に移動)
t.setx(0)      # X座標を0にする (左に移動)

turtle.done()

turtle.setheading(angle) / turtle.seth(angle) (向きの絶対設定)

タートルの向きを、絶対的な角度で設定します。0度は東(右)、90度は北(上)、180度は西(左)、270度は南(下)です。向きを設定した後にforward()などを使うと、その向きに移動します。

  • angle: 設定する角度(度数法)。


import turtle
t = turtle.Turtle()
t.speed(1)

t.setheading(90)   # 上(北)を向く
t.forward(100)     # 上に100ピクセル進む

t.seth(0)          # 右(東)を向く
t.forward(50)      # 右に50ピクセル進む

turtle.done()

turtle.left(angle) / turtle.lt(angle) (左回転)

タートルが現在向いている方向から、指定された角度だけ左に回転します。

  • angle: 左に回転する角度(度数法)。


import turtle
t = turtle.Turtle()
t.speed(1)

t.forward(100)
t.left(90)     # 左に90度回転
t.forward(100)

turtle.done()

turtle.right(angle) / turtle.rt(angle) (右回転)

  • angle: 右に回転する角度(度数法)。
import turtle
t = turtle.Turtle()
t.speed(1)

t.forward(100)
t.right(90)    # 右に90度回転
t.forward(100)

turtle.done()
  • turtle.setheading():

    • タートルの向きを絶対的に設定したい場合に最適です。
    • 特定の方向から描画を開始したり、複雑なパスの一部としてタートルの向きを固定したりする際に使用します。
  • turtle.setx() / turtle.sety():

    • 水平または垂直な移動のみを行いたい場合に便利です。
    • グラフを描いたり、特定のグリッドに沿って移動したりする際に役立ちます。
  • turtle.forward() / turtle.backward()turtle.left() / turtle.right():

    • 相対的な移動(現在位置と向きからの移動)を行いたい場合に最適です。
    • 正方形や三角形、円、螺旋など、繰り返しのパターンを持つ図形を描く際に非常に効率的です。
    • タートルの向きを自分で制御したい場合に適しています。
  • turtle.goto(x, y):

    • 特定の絶対座標に移動したい場合に最適です。
    • 図形の角など、明確な座標がわかっている場合に便利です。
    • 移動中にタートルの向きは自動的に目標座標を向くように変わります。