turtle.teleport()

2025-06-06

turtle.teleport()は、Pythonのturtleグラフィックスライブラリでカメ(描画するペン)を指定した座標に移動させるためのメソッドです。このメソッドの最大の特徴は、線を引かずに移動する点です。

turtle.teleport()の主な特徴と使い方

  1. 座標の指定: teleport()は、移動先のX座標とY座標を引数として受け取ります。

    • turtle.teleport(x, y): (x, y)の座標に移動します。
    • turtle.teleport(point): (x, y)のようなタプルやVec2Dオブジェクトで座標を指定することもできます。
  2. goto()setpos()との違い:

    • goto(x, y)setpos(x, y)も指定した座標に移動しますが、これらはデフォルトで線を引きます。線を引かずに移動したい場合は、手動でpenup()pendown()を呼び出す必要があります。
    • teleport()は、内部で自動的にペンを上げ下げしてくれるため、より簡潔に線を引かない移動を実現できます。
  3. fill_gap引数(Python 3.12以降): Python 3.12以降では、fill_gapというキーワード引数が追加されました。これは、teleportで移動した際に、移動元の位置と移動先の位置の間に描画されている図形の「塗りつぶし」のギャップをどう処理するかを制御します。

    • fill_gap=True: 移動元と移動先の間に隙間ができないように、図形の塗りつぶしを継続します。
    • fill_gap=False (デフォルト): 塗りつぶしが中断され、移動元と移動先の間に塗りつぶしの隙間ができます。
import turtle

# 画面とカメのセットアップ
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1) # 少しゆっくりめに動くように設定

# 最初の位置から線を引く
t.forward(100)
t.left(90)
t.forward(100)

# teleport() を使って線を引かずに別の位置へ移動
# (X=150, Y=-50) へ瞬間移動
t.teleport(150, -50)

# 移動先から再度線を引く
t.right(90)
t.forward(100)

# fill_gap の例(Python 3.12以降)
# t.begin_fill()
# t.circle(50)
# t.teleport(-100, -100, fill_gap=True) # 塗りつぶしを継続して移動
# t.circle(50)
# t.end_fill()


screen.mainloop() # 画面を開いたままにする


turtle.teleport()の一般的なエラーとトラブルシューティング

AttributeError: 'Turtle' object has no attribute 'teleport'

エラーの原因
このエラーは、最も一般的な問題の一つです。turtle.teleport()は、Python 3.12以降で導入された比較的新しい機能です。そのため、それ以前のPythonバージョン(例: Python 3.11以前)を使用している場合、このメソッドは存在せず、AttributeErrorが発生します。

トラブルシューティング

  • 代替手段を使用する
    アップグレードが難しい場合や、一時的な解決策が必要な場合は、以下の従来のやり方で同様の動作を実現できます。
    import turtle
    
    t = turtle.Turtle()
    t.penup()      # ペンを持ち上げる
    t.goto(x, y)   # 指定座標へ移動(線は引かれない)
    t.pendown()    # ペンを下ろす(移動後から線が引かれるようになる)
    
    これはteleport()が内部的に行っている処理とほぼ同じです。
  • Pythonをアップグレードする
    もし古いバージョンのPythonを使用している場合は、Python 3.12以降にアップグレードすることを検討してください。
  • Pythonのバージョンを確認する
    使用しているPythonのバージョンが3.12以降であることを確認してください。コマンドラインでpython --versionまたはpython3 --versionを実行して確認できます。

引数の間違い (TypeError: teleport() missing 1 required positional argument: 'x' など)

エラーの原因
teleport()は、移動先のX座標とY座標を引数として受け取ります。引数が不足している、または間違った形式で渡されている場合に発生します。

  • あるいは、x(x, y)のようなタプルやVec2Dオブジェクトを渡すこともできますが、その場合はyを省略する必要があります。
  • teleport()は、xyの2つの数値引数を期待します。

トラブルシューティング

  • 公式ドキュメントを確認し、正しい引数の渡し方を確認してください。
  • 引数の数と型を確認する
    • 2つの数値引数で呼び出す場合: t.teleport(100, 50)
    • タプルで呼び出す場合: t.teleport((100, 50)) (この場合、yは指定しません)

fill_gap引数に関する問題(Python 3.12以降の特定のケース)

エラーの原因
fill_gap引数はPython 3.12以降で追加されたものです。それ以前のバージョンでfill_gapを指定すると、認識されずにエラーになる可能性があります。また、引数の指定方法が間違っている場合もエラーになります。

トラブルシューティング

  • キーワード引数として使用
    fill_gapはキーワード引数として渡す必要があります。
    t.teleport(100, 50, fill_gap=True)
    
  • Pythonバージョンとfill_gapの互換性を確認
    使用しているPythonが3.12以降であることを確認してください。

turtleウィンドウが表示されない、またはすぐに閉じてしまう

エラーの原因
これはteleport()特有の問題ではありませんが、turtleプログラムでよく見られる問題です。

  • Tkinterが正しくインストールされていない、または利用できない環境の場合、グラフィックが表示されません。
  • プログラムが終了すると、turtleウィンドウも自動的に閉じられます。

トラブルシューティング

  • Tkinterのインストールを確認
    Pythonのインストール時にTkinterサポートが有効になっているか確認してください。特にAnacondaなどのディストリビューションを使用している場合は、問題がないことが多いですが、Pythonをソースからビルドした場合などは注意が必要です。
  • turtle.done()またはturtle.mainloop()を呼び出す
    プログラムの最後にturtle.done()(手続き型インターフェースの場合)またはscreen.mainloop()(オブジェクト指向インターフェースの場合)を追加して、ウィンドウが開いたままになるようにします。
    import turtle
    
    # ... turtleのコード ...
    
    turtle.done() # または screen.mainloop()
    

意図しない線の描画(teleport()を使用しているにもかかわらず)

エラーの原因
teleport()は自動的にペンを上げてから移動しますが、その前に既にペンが下がっていて、teleport()呼び出しの直前にforward()goto()などで線を引いていた場合、その線は残ります。teleport()は、あくまで移動中に線を引かないだけで、移動前後に引かれた線には影響しません。

  • もし特定の描画をクリアしたい場合は、turtle.clear()(カメの描画のみを消す)やturtle.clearscreen()(画面全体をクリアする)などを適宜使用してください。
  • teleport()は瞬間移動させるためのものであり、それまでの描画履歴を消すわけではないことを理解してください。
  • シンプルなコードで再現テスト
    複雑なプログラムの一部で問題が発生している場合、teleport()に関する部分だけを抜き出して、最小限のコードで問題が再現するかどうかを試すと、原因を特定しやすくなります。
  • 小文字/大文字の区別
    Pythonは小文字と大文字を区別します。teleportは小文字です。
  • import turtleを確認
    turtleモジュールが正しくインポートされているか確認してください。
  • エラーメッセージをよく読む
    Pythonのエラーメッセージは、問題の特定に役立つ情報を含んでいます。特にTypeErrorAttributeErrorの場合、何が問題なのかを具体的に示していることが多いです。


turtle.teleport()は、カメ(描画ペン)を線を引かずに指定した位置へ瞬間移動させるために使われます。

例1:線を引かずに四角形の間を移動する

この例では、turtle.teleport()を使って、二つの異なる場所に四角形を描画します。teleport()を使用することで、最初の四角形を描き終えた後、ペンを上げ下げする手間なく、2番目の四角形を描く位置まで移動できます。

import turtle

# 画面とカメのセットアップ
screen = turtle.Screen()
screen.setup(width=600, height=400) # 画面サイズを設定
t = turtle.Turtle()
t.speed(1) # カメの速度を速く設定 (0:最速, 1:最も遅い, 10:速い)
t.pensize(3) # ペンの太さ

# ---------- 最初の四角形を描く ----------
t.pencolor("blue") # ペンの色を青に設定
t.penup()          # ペンを持ち上げる
t.goto(-200, 50)   # 描画開始位置へ移動 (線を引かない)
t.pendown()        # ペンを下ろす

# 四角形を描く
for _ in range(4):
    t.forward(100)
    t.right(90)

# ---------- teleport() を使って線を引かずに移動する ----------
# 新しい描画位置へ瞬間移動 (線を引かない)
# Python 3.12未満の場合は、t.penup(); t.goto(100, -50); t.pendown() を使用
t.teleport(100, -50) 

# ---------- 2番目の四角形を描く ----------
t.pencolor("red") # ペンの色を赤に設定

# 四角形を描く
for _ in range(4):
    t.forward(100)
    t.right(90)

# プログラムが終了しないように画面を開いたままにする
screen.mainloop()

解説

  • 移動後、カメはペンが下ろされた状態になるため、すぐに2番目の四角形を描き始めることができます。
  • 最初の四角形を描いた後、t.teleport(100, -50)を呼び出しています。これにより、カメは現在の位置から(100, -50)まで線を引かずに瞬間移動します。この移動中、penup()pendown()を明示的に呼び出す必要はありません。
  • t.goto(-200, 50)で最初の四角形の開始位置へ移動しますが、その前にt.penup()t.pendown()を呼び出しているため、線は引かれません。

例2:図形の塗りつぶし中にteleport()fill_gapを使用する (Python 3.12以降)

この例では、turtle.teleport()fill_gap引数を使って、塗りつぶされた円の描画中に移動し、塗りつぶしがどのように継続されるかを示します。このfill_gap引数はPython 3.12以降で利用可能です。

import turtle

# 画面とカメのセットアップ
screen = turtle.Screen()
screen.setup(width=600, height=400)
t = turtle.Turtle()
t.speed(1)
t.pensize(2)

# ---------- fill_gap=False (デフォルト) の場合 ----------
t.penup()
t.goto(-200, 100)
t.pendown()

t.color("green", "lightgreen") # ペン色と塗りつぶし色を設定
t.begin_fill() # 塗りつぶし開始
t.circle(40)   # 円を描く

# fill_gap=False (デフォルト) で瞬間移動
# 移動元と移動先の間に塗りつぶしの「隙間」ができる
t.teleport(0, 100, fill_gap=False) 

t.circle(40) # もう一度円を描く
t.end_fill() # 塗りつぶし終了

# ---------- fill_gap=True の場合 ----------
t.penup()
t.goto(-200, -100)
t.pendown()

t.color("blue", "lightblue") # ペン色と塗りつぶし色を設定
t.begin_fill() # 塗りつぶし開始
t.circle(40)   # 円を描く

# fill_gap=True で瞬間移動
# 移動元と移動先の間に塗りつぶしが継続される(隙間ができない)
t.teleport(0, -100, fill_gap=True) 

t.circle(40) # もう一度円を描く
t.end_fill() # 塗りつぶし終了

# プログラムが終了しないように画面を開いたままにする
screen.mainloop()

解説

  • fill_gap=Trueの場合、teleport()で移動した際に、移動元と移動先の間に塗りつぶしのパスが生成され、塗りつぶしが継続されます。これにより、移動中でも途切れることのない塗りつぶしパスを作成できます。
  • fill_gap=False(デフォルト)の場合、teleport()で移動した際に、移動元と移動先の間に塗りつぶしのパスが生成されません。結果として、塗りつぶしに「隙間」ができます。
  • t.begin_fill()t.end_fill()の間で描かれた図形は、指定された色で塗りつぶされます。

この例では、teleport()を使って、画面の異なる場所に複数の独立した図形(三角形と円)を描画します。

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
t = turtle.Turtle()
t.speed(3)
t.pensize(2)

# ---------- 三角形を描く関数 ----------
def draw_triangle(x, y, size, color):
    t.teleport(x, y) # 指定位置へ瞬間移動
    t.pencolor(color)
    t.fillcolor(color)
    t.begin_fill()
    for _ in range(3):
        t.forward(size)
        t.left(120)
    t.end_fill()

# ---------- 円を描く関数 ----------
def draw_circle(x, y, radius, color):
    t.teleport(x, y) # 指定位置へ瞬間移動
    t.pencolor(color)
    t.fillcolor(color)
    t.begin_fill()
    t.circle(radius)
    t.end_fill()

# ---------- 図形を描画 ----------
draw_triangle(-200, 100, 80, "purple")
draw_circle(100, 50, 40, "orange")
draw_triangle(-50, -150, 60, "brown")
draw_circle(200, -100, 30, "pink")

screen.mainloop()
  • これにより、関数を呼び出すたびにカメが瞬間移動し、その場所で独立した図形を描画することができます。penup()pendown()を毎回書く必要がないため、コードがより簡潔になります。
  • draw_triangledraw_circleという2つの関数を定義しています。それぞれの関数内で、まずt.teleport(x, y)を呼び出して描画開始位置へ移動しています。


penup() と goto() / setpos() と pendown() の組み合わせ

これはteleport()が内部的に行っていることとほぼ同じであり、最も一般的で理解しやすい代替手段です。

説明

  • turtle.pendown(): カメがペンを下ろします。この状態から、カメが移動すると線が描画されるようになります。
  • turtle.goto(x, y) または turtle.setpos(x, y): カメを指定された(x, y)座標に移動させます。penup()の状態であれば、この移動中に線は引かれません。
  • turtle.penup(): カメがペンを持ち上げます。この状態では、カメが移動しても線は描画されません。

コード例

import turtle

screen = turtle.Screen()
t = turtle.Turtle()
t.speed(1) # 少し遅めに設定

# 最初の四角形を描く
t.pencolor("blue")
t.forward(100)
t.right(90)
t.forward(100)

# teleport() の代替手段:線を引かずに移動する
t.penup()          # ペンを持ち上げる
t.goto(150, -50)   # 指定座標へ移動 (この間は線を引かない)
t.pendown()        # ペンを下ろす

# 移動先から再度線を引く
t.pencolor("red")
t.right(90)
t.forward(100)

screen.mainloop()

利点

  • teleport()が導入される前から標準的な方法として使われていた。
  • 非常に明確で理解しやすい。
  • Pythonのすべてのバージョンで利用可能。

欠点

  • 常に3つのメソッド呼び出し(penup(), goto(), pendown())が必要で、コードが少し冗長になる可能性がある。

setx(), sety() の組み合わせ (あまり推奨されないが、状況によっては使用可能)

setx()sety()は個別にX座標やY座標を設定しますが、これらもペンが上がっていれば線を引かずに移動できます。しかし、通常はgoto()の方が簡潔です。

説明

  • turtle.sety(y): カメのY座標をyに設定します。X座標は変更しません。
  • turtle.setx(x): カメのX座標をxに設定します。Y座標は変更しません。

コード例

import turtle

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

# まずは何か描く
t.forward(50)

# teleport() の代替手段 (setx, sety の組み合わせ)
t.penup()
t.setx(100)  # X座標だけ移動
t.sety(50)   # Y座標だけ移動 (これで (100, 50) に到達)
t.pendown()

t.circle(30)

screen.mainloop()

利点

  • XまたはY座標のみを個別に変更したい場合に便利(ただし、その場合はgotoの方が柔軟性がある)。

欠点

  • あまり一般的ではないため、コードの可読性が下がる可能性がある。
  • 特定の座標へ移動する場合、goto(x, y)より2つの呼び出しが必要になり、冗長になる。

直接的な代替手段ではありませんが、複数のturtleオブジェクトを扱う際に、それぞれのカメが独立して移動・描画できるため、teleport()のように「瞬間移動」を意識する必要が少なくなる場合があります。

説明
各カメは独立した状態(位置、ペンの状態など)を持つため、あるカメが線を引きながら移動している間に、別のカメをpenup()goto()で移動させることができます。

コード例

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)

# 最初のカメ
t1 = turtle.Turtle()
t1.color("blue")
t1.shape("turtle")
t1.pensize(3)
t1.speed(1)
t1.penup()
t1.goto(-200, 0)
t1.pendown()

# 最初のカメで何か描く
t1.circle(50)

# 2番目のカメ (teleport()の概念を代替)
t2 = turtle.Turtle()
t2.color("red")
t2.shape("arrow")
t2.pensize(3)
t2.speed(1)
t2.penup()
t2.goto(100, 0) # 2番目のカメを直接目的地へ移動
t2.pendown()

# 2番目のカメで何か描く
t2.dot(10)
t2.forward(100)

screen.mainloop()

利点

  • 各描画エンティティの状態が独立している。
  • 複数の描画タスクを並行して(論理的に)処理できる。
  • リソースをより多く消費する可能性がある(複数のTurtleオブジェクトを生成するため)。
  • teleport()の直接的な目的(単一のカメを線を引かずに移動させる)とは少し異なるアプローチ。