【Python】Turtleのクリックイベント:よくあるエラーと解決法

2025-06-06

Pythonの turtle モジュールにおける turtle.onclick() は、特定のタートル(亀のアイコン)がクリックされたときに実行される関数を設定するためのメソッドです。

基本的な考え方

turtle グラフィックスでは、画面上にタートルというキャラクターが表示され、そのタートルを動かしたり、線を描かせたりすることができます。onclick() を使うと、そのタートルがマウスでクリックされたときに、あらかじめ定義しておいた特定の処理(関数)を実行させることができます。

turtle.onclick() の使い方

import turtle

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

# クリックされたときに実行される関数を定義
def on_click_handler(x, y):
    """
    タートルがクリックされたときに呼び出される関数。
    クリックされた座標 (x, y) が引数として渡されます。
    """
    print(f"タートルがクリックされました! 座標: ({x}, {y})")
    my_turtle.forward(50)  # タートルを50歩進める
    my_turtle.left(90)     # タートルを左に90度回転させる

# タートルにonclickイベントハンドラを設定
my_turtle.onclick(on_click_handler)

# 画面をクリック待ちの状態にする
turtle.done()

説明

  1. import turtle: turtle モジュールをインポートします。
  2. my_turtle = turtle.Turtle(): 画面に表示されるタートルオブジェクトを作成します。
  3. def on_click_handler(x, y)
    :
    • この関数が、タートルがクリックされたときに呼び出される関数です。
    • この関数は、クリックされた位置のX座標とY座標を引数として受け取ります。この例では xy で受け取っています。
    • 関数の中には、クリック時に実行したい処理を記述します。上記の例では、クリックされたことを示すメッセージを表示し、タートルを移動させています。
  4. my_turtle.onclick(on_click_handler):
    • これが onclick() メソッドの肝となる部分です。
    • my_turtle というタートルオブジェクトに対して、onclick() を呼び出しています。
    • 引数には、クリックされたときに呼び出したい関数 (on_click_handler) を指定します。関数名の後ろに () はつけないことに注意してください。これは、関数を「実行」するのではなく、「この関数をイベント発生時に呼び出す」という設定だからです。
  5. turtle.done():
    • これは turtle グラフィックスの画面を閉じずに、ユーザーの操作(この場合はクリック)を待ち続けるために必要です。これがないと、プログラムがすぐに終了してしまいます。

onclick() のオプション引数

  • add (デフォルト: None): イベントハンドラの追加方法を指定します。
    • True: 既存のイベントハンドラに加えて、新しいハンドラを追加します。
    • False: 既存のイベントハンドラを置き換えます。
  • btn (デフォルト: 1): どのマウスボタンがクリックされたときに反応するかを指定します。
    • 1: 左クリック (デフォルト)
    • 2: 中央クリック (ホイールボタン)
    • 3: 右クリック

例(右クリックで反応する場合)

import turtle

my_turtle = turtle.Turtle()

def on_right_click(x, y):
    print(f"右クリックされました! 座標: ({x}, {y})")
    my_turtle.dot(10, "blue") # 青い点を描く

my_turtle.onclick(on_right_click, btn=3) # btn=3 で右クリックに設定

turtle.done()
  • イベントハンドラとして渡す関数は、必ず2つの引数(クリックされたX座標とY座標)を受け取るように定義する必要があります。
  • turtle.onclick() は、特定のタートルオブジェクトがクリックされたときにのみ反応します。画面全体へのクリックイベントを処理したい場合は、turtle.Screen() オブジェクトの onscreenclick() メソッドを使用します。


turtle.onclick() は、タートルグラフィックスでインタラクティブなプログラムを作成する上で非常に便利な機能ですが、使い方を誤ると予期せぬ挙動やエラーが発生することがあります。

TypeError: 'NoneType' object is not callable または TypeError: function() takes 0 positional arguments but 2 were given

これは最もよくあるエラーの一つです。

原因
turtle.onclick() に、関数そのものではなく、関数の戻り値を渡してしまっている場合に発生します。また、onclick に渡す関数が、引数 x, y を受け取るように定義されていない場合もこのエラーになります。onclick はクリックされた座標 (x, y) を自動的にイベントハンドラ関数に渡そうとするためです。

悪い例

import turtle

my_turtle = turtle.Turtle()

def my_function():
    print("クリックされました!")

#  間違い:my_function() を呼び出して、その戻り値 (None) を onclick に渡している
my_turtle.onclick(my_function()) 

#  間違い:my_function が x, y を受け取らない
my_turtle.onclick(my_function) # この場合は 'TypeError: my_function() takes 0 positional arguments but 2 were given' が発生

正しい使い方

onclick() には、呼び出したい関数オブジェクトそのものを引数として渡します。そして、その関数は x, y の2つの引数を受け取るように定義する必要があります。

import turtle

my_turtle = turtle.Turtle()

#  正しい:x, y を引数として受け取るように定義
def my_function_handler(x, y):
    print(f"タートルがクリックされました! 座標: ({x}, {y})")
    my_turtle.forward(50)

#  正しい:関数名だけを渡す(括弧なし)
my_turtle.onclick(my_function_handler) 

turtle.done()

クリックしても何も起こらない

プログラムは実行されるものの、タートルをクリックしても何も反応しない場合に考えられる原因です。

原因

  • クリック対象がタートルではない
    turtle.onclick() は特定のタートルオブジェクトに紐づくイベントです。画面全体のクリックに反応させたい場合は turtle.Screen().onclick() を使う必要があります。
  • 別のイベントが優先されている
    複数のイベントハンドラを設定している場合、意図しないハンドラが先に処理されている可能性があります。
  • イベントハンドラ関数に問題がある
    onclick に設定した関数が正しく動作しない、または期待する処理が記述されていない。
  • turtle.done() または turtle.mainloop() が呼ばれていない
    turtle グラフィックスは、イベントループが開始されないと、クリックなどのイベントを処理しません。プログラムの最後に turtle.done() (または turtle.mainloop())を呼び出す必要があります。

トラブルシューティング

  1. turtle.done() を確認する
    コードの最後に turtle.done() が記述されているか確認してください。
    import turtle
    
    my_turtle = turtle.Turtle()
    
    def click_handler(x, y):
        print("クリックされました!")
    
    my_turtle.onclick(click_handler)
    
    turtle.done() # これが重要!
    
  2. イベントハンドラ関数のデバッグ
    onclick に設定した関数内に print() 文を挿入して、関数が実際に呼び出されているか、期待通りに実行されているかを確認します。
    def click_handler(x, y):
        print(f"click_handlerが呼び出されました。x={x}, y={y}") # デバッグ用
        # ... 実際の処理 ...
    
  3. turtle.Screen().onclick() との混同がないか確認
    意図的にタートルオブジェクトをクリックしているのに反応しない場合は、タートルオブジェクトの onclick() を使っているか確認してください。
    • 画面全体のクリック
      turtle.Screen().onclick(my_screen_click_handler)
    • 特定のタートルのクリック
      my_turtle_object.onclick(my_turtle_click_handler)

AttributeError: 'Turtle' object has no attribute 'onclick' (あまり一般的ではないが、古いバージョンや誤った記述で起こりうる)

原因
turtle オブジェクトが正しく作成されていないか、Pythonのバージョンが非常に古い場合に考えられます。しかし、通常は turtle.Turtle() で作成されたオブジェクトには onclick メソッドが存在します。

トラブルシューティング

  • turtle モジュールが正しくインポートされているか確認します (import turtle)。
  • タートルオブジェクトが正しくインスタンス化されているか確認します (my_turtle = turtle.Turtle())。

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

原因
onclick に渡す関数が x, y の引数を受け取るように定義されていない場合に発生します。turtle はクリックイベント発生時に自動的にマウスのX座標とY座標を引数として渡そうとします。

悪い例

import turtle

my_turtle = turtle.Turtle()

def my_function_no_args(): #  引数がない
    print("クリックされました!")

my_turtle.onclick(my_function_no_args) 

turtle.done()

正しい使い方
必ず2つの引数を受け取るように定義します。引数を使わない場合でも定義は必要です。

import turtle

my_turtle = turtle.Turtle()

def my_function_with_args(x, y): #  x, y を受け取る
    print("クリックされました! (座標は使用せず)")

my_turtle.onclick(my_function_with_args) 

turtle.done()

onclick に渡す関数に独自の引数を渡したい場合

onclick(x, y) の2つの引数しか自動的に渡してくれません。しかし、イベントハンドラ関数にそれ以外の情報も渡したい場合があります。

  • クラスのメソッドを使用する
    オブジェクト指向プログラミングの手法を用いると、タートルの状態や振る舞いをカプセル化し、より整理されたコードになります。イベントハンドラをクラスのメソッドとして定義すれば、そのメソッドはクラスのインスタンス変数にアクセスできます。

    import turtle
    
    class MyInteractiveTurtle:
        def __init__(self):
            self.t = turtle.Turtle()
            self.click_count = 0
            self.t.onclick(self.handle_click) # メソッドをイベントハンドラに設定
    
        def handle_click(self, x, y):
            self.click_count += 1
            print(f"タートルがクリックされました! (回数: {self.click_count}, 座標: ({x}, {y}))")
            self.t.forward(30)
            self.t.left(45)
    
    if __name__ == "__main__":
        app_turtle = MyInteractiveTurtle()
        turtle.done()
    
  • functools.partial を使用する
    より柔軟に、追加の引数を渡したい場合に適しています。

    import turtle
    from functools import partial
    
    my_turtle = turtle.Turtle()
    
    def move_and_draw(distance, angle, x, y): # 追加の引数 'distance', 'angle'
        my_turtle.forward(distance)
        my_turtle.left(angle)
        print(f"移動して描画しました。距離: {distance}, 角度: {angle}")
    
    # partial を使って、distance と angle を事前に設定
    my_turtle.onclick(partial(move_and_draw, 100, 90)) 
    
    turtle.done()
    
  • lambda 式を使用する
    簡単な処理で、追加の引数が定数である場合に便利です。

    import turtle
    
    my_turtle = turtle.Turtle()
    color_list = ["red", "green", "blue"]
    current_color_index = 0
    
    def change_color(color, x, y): # 追加の引数 'color' を受け取る
        global current_color_index
        my_turtle.color(color)
        current_color_index = (current_color_index + 1) % len(color_list)
        print(f"色が変わりました: {color}")
    
    # lambda を使って、追加の引数 'color_list[current_color_index]' を渡す
    # ただし、この方法だと my_turtle.onclick() が実行された時点の current_color_index の値が固定されてしまう
    # 動的に変化させたい場合は注意が必要
    my_turtle.onclick(lambda x, y: change_color(color_list[current_color_index], x, y))
    
    turtle.done()
    


turtle.onclick() は、特定のタートル(亀のアイコン)がマウスでクリックされたときに、指定した関数を実行するための機能です。

基本的なクリックイベントの処理

最も基本的な例です。タートルがクリックされたときに、コンソールにメッセージを表示し、タートルを少し動かします。

import turtle

# 1. タートルオブジェクトを作成
my_turtle = turtle.Turtle()
my_turtle.shape("turtle") # タートルの形を亀にする
my_turtle.color("blue")   # 色を青にする

# 2. クリックされたときに実行される関数を定義
#    この関数は、クリックされたX座標とY座標を引数として受け取る必要があります。
def handle_turtle_click(x, y):
    print(f"タートルがクリックされました! 座標: ({x}, {y})")
    my_turtle.forward(50)  # タートルを50歩進める
    my_turtle.left(90)     # タートルを左に90度回転させる

# 3. タートルにonclickイベントハンドラを設定
#    関数名を引数として渡します(括弧は不要)。
my_turtle.onclick(handle_turtle_click)

# 4. 画面をクリック待ちの状態にする
#    これがないと、プログラムがすぐに終了してしまいます。
turtle.done()

解説

  • handle_turtle_click 関数は、xy という2つの引数を受け取ります。これらはクリックされた位置の座標です。
  • my_turtle.onclick(handle_turtle_click) の部分が重要です。handle_turtle_click 関数をタートルのクリックイベントに関連付けています。

複数のタートルに異なるクリックイベントを設定する

複数のタートルを作成し、それぞれに異なるクリックイベントを設定する例です。

import turtle

# 画面設定
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.title("複数のタートルクリックイベント")

# 赤いタートル
red_turtle = turtle.Turtle()
red_turtle.shape("turtle")
red_turtle.color("red")
red_turtle.penup() # 線を描かずに移動
red_turtle.goto(-150, 0)
red_turtle.pendown()

# 青いタートル
blue_turtle = turtle.Turtle()
blue_turtle.shape("turtle")
blue_turtle.color("blue")
blue_turtle.penup()
blue_turtle.goto(150, 0)
blue_turtle.pendown()

# 赤いタートルのクリックハンドラ
def red_turtle_clicked(x, y):
    print(f"赤いタートルがクリックされました! 座標: ({x}, {y})")
    red_turtle.dot(20, "orange") # クリックされた位置にオレンジ色の点を描く

# 青いタートルのクリックハンドラ
def blue_turtle_clicked(x, y):
    print(f"青いタートルがクリックされました! 座標: ({x}, {y})")
    blue_turtle.circle(30) # 円を描く

# 各タートルにイベントハンドラを設定
red_turtle.onclick(red_turtle_clicked)
blue_turtle.onclick(blue_turtle_clicked)

turtle.done()

解説

  • これにより、クリックされたタートルに応じて異なるアクションを実行できます。
  • それぞれのタートルに対して、異なるイベントハンドラ関数 (red_turtle_clickedblue_turtle_clicked) を onclick() で設定しています。
  • red_turtleblue_turtle という2つの独立したタートルオブジェクトを作成しています。

btn 引数を使ってマウスボタンを指定する

onclick()btn 引数を使って、どのマウスボタン(左、中央、右)に反応するかを指定する例です。

import turtle

my_turtle = turtle.Turtle()
my_turtle.shape("arrow") # 形を矢印にする
my_turtle.color("purple")
my_turtle.penup() # 線を描かずに移動
my_turtle.goto(0, 0) # 中心に配置

# 左クリックハンドラ (btn=1 はデフォルトなので省略可能)
def left_click_handler(x, y):
    print(f"左クリックされました! ({x}, {y})")
    my_turtle.right(45) # 右に45度回転

# 中央クリック (ホイールボタン) ハンドラ
def middle_click_handler(x, y):
    print(f"中央クリックされました! ({x}, {y})")
    my_turtle.home() # 初期位置に戻る

# 右クリックハンドラ
def right_click_handler(x, y):
    print(f"右クリックされました! ({x}, y})")
    my_turtle.clear() # 描画をクリア

# イベントハンドラを設定
my_turtle.onclick(left_click_handler, btn=1)  # 左クリック (デフォルトなのでなくても動作)
my_turtle.onclick(middle_click_handler, btn=2) # 中央クリック
my_turtle.onclick(right_click_handler, btn=3)  # 右クリック

turtle.done()

解説

  • 同じタートルに対して複数の onclick() を呼び出すことで、異なるボタンに異なる処理を割り当てられます。
  • onclick() の第2引数 btn1 (左), 2 (中央), 3 (右) を指定することで、特定のボタンのクリックにのみ反応させることができます。

lambda 式を使った簡単なインライン処理

イベントハンドラ関数が非常にシンプルで、特別な処理を必要としない場合、lambda 式を使ってその場で関数を定義することができます。

import turtle

my_turtle = turtle.Turtle()
my_turtle.shape("circle") # 形を円にする
my_turtle.color("green")
my_turtle.penup()
my_turtle.goto(-100, 0)

another_turtle = turtle.Turtle()
another_turtle.shape("square") # 形を四角にする
another_turtle.color("orange")
another_turtle.penup()
another_turtle.goto(100, 0)

# lambda を使ったクリックハンドラ
# 引数 x, y は受け取るが、この例では使用しない
my_turtle.onclick(lambda x, y: my_turtle.write("緑の円がクリック!", font=("Arial", 16, "normal")))
another_turtle.onclick(lambda x, y: another_turtle.write("オレンジの四角がクリック!", font=("Arial", 16, "normal")))

turtle.done()

解説

  • 非常に短い処理の場合にコードを簡潔に保てます。ただし、複雑な処理や複数のステートメントを含む場合は、通常の def で関数を定義する方が読みやすくなります。
  • lambda x, y: ... は、xy を引数として受け取り、: の後の式を実行する匿名関数です。

クラスを使ったより複雑なインタラクション

オブジェクト指向プログラミングの手法を用いることで、タートルの状態を管理しながら、より複雑なインタラクションを実現できます。

import turtle

class ClickableTurtle:
    def __init__(self, x, y, color):
        self.t = turtle.Turtle()
        self.t.shape("turtle")
        self.t.color(color)
        self.t.penup()
        self.t.goto(x, y)
        self.t.pendown()
        self.click_count = 0 # クリック回数を追跡するための変数

        # タートルのクリックイベントを、このクラスのメソッドに設定
        self.t.onclick(self.handle_click) 

    def handle_click(self, x, y):
        self.click_count += 1
        print(f"タートル({self.t.color()[0]})がクリックされました! (回数: {self.click_count}, 座標: ({x}, {y}))")
        
        # クリック回数に応じて異なる動作
        if self.click_count % 3 == 1:
            self.t.forward(50)
        elif self.click_count % 3 == 2:
            self.t.left(90)
        else:
            self.t.right(90)
        
        self.t.write(f"Clicks: {self.click_count}", align="center", font=("Arial", 8, "normal"))


if __name__ == "__main__":
    screen = turtle.Screen()
    screen.setup(width=600, height=400)
    screen.title("クラスでインタラクティブなタートル")

    # ClickableTurtle のインスタンスを作成
    turtle1 = ClickableTurtle(-100, 0, "red")
    turtle2 = ClickableTurtle(100, 0, "green")

    turtle.done()
  • これにより、複数のインタラクティブなタートルを簡単に管理し、それぞれが独自の動作を持つようにできます。
  • handle_click メソッドは、self.click_count のようなインスタンス変数にアクセスできるため、クリックごとにタートルの状態を変更したり、履歴を追跡したりできます。
  • __init__ メソッド内で self.t.onclick(self.handle_click) とすることで、このクラスの handle_click メソッドをイベントハンドラとして設定しています。
  • ClickableTurtle クラスを定義し、タートルオブジェクト (self.t) とその状態(self.click_count)をカプセル化しています。


turtle.onclick() は特定のタートルオブジェクトのクリックに特化していますが、turtle モジュールやPythonの他のライブラリには、より広範なマウスイベントやユーザー入力を扱うための方法があります。

turtle.Screen().onclick() または turtle.Screen().onscreenclick()

これは turtle.onclick() の最も直接的な代替手段であり、画面全体へのクリックイベントを処理する際に使用します。特定のタートルがクリックされたかどうかではなく、画面のどこかがクリックされたかを検出します。

特徴

  • 用途
    クリックで描画モードを切り替えたり、画面の任意の位置にタートルを移動させたりする場合に便利です。
  • 引数
    turtle.onclick() と同様に、クリックされたX座標とY座標を引数として受け取る関数を設定します。
  • 画面全体が対象
    タートルの位置に関わらず、画面のどこをクリックしてもイベントが発生します。

コード例

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.title("画面全体のクリックイベント")

my_turtle = turtle.Turtle()
my_turtle.shape("turtle")
my_turtle.color("red")
my_turtle.penup() # 線を描かずに移動

# 画面がクリックされたときに実行される関数
def screen_clicked(x, y):
    print(f"画面がクリックされました! 座標: ({x}, {y})")
    my_turtle.goto(x, y) # クリックされた場所にタートルを移動
    my_turtle.dot(10, "blue") # その場所に青い点を描く

# 画面のクリックイベントハンドラを設定
screen.onclick(screen_clicked) # または screen.onscreenclick(screen_clicked)

turtle.done()

turtle.Screen().onkey() / turtle.Screen().onkeypress() / turtle.Screen().onkeyrelease()

これらのメソッドは、マウスのクリックではなく、キーボードのキー入力に反応するイベントハンドラを設定します。ユーザーがキーを押したり離したりしたときに特定のアクションを実行したい場合に有用です。

特徴

  • listen() が必須
    キーイベントを検出するためには、screen.listen() を呼び出す必要があります。
  • 引数
    イベントハンドラ関数は引数をとりません。
  • キー入力の検出
    特定のキーが押された、または離されたときにイベントを発生させます。

コード例

import turtle

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.title("キーボードイベントでタートルを操作")

my_turtle = turtle.Turtle()
my_turtle.shape("arrow")
my_turtle.color("green")

def move_forward():
    my_turtle.forward(20)

def turn_left():
    my_turtle.left(30)

def turn_right():
    my_turtle.right(30)

# イベントハンドラをキーにバインド
screen.onkey(move_forward, "Up")      # 上矢印キーで前進
screen.onkey(turn_left, "Left")       # 左矢印キーで左回転
screen.onkey(turn_right, "Right")     # 右矢印キーで右回転
screen.onkey(my_turtle.clear, "c")    # 'c' キーで描画クリア

# キー入力をリッスンする
screen.listen() 

turtle.done()

タイマーイベント (turtle.Screen().ontimer())

これは直接的なクリックイベントの代替ではありませんが、時間ベースのインタラクションを実現する際に重要です。一定時間ごとに自動的に処理を実行することで、アニメーションやゲームのロジックを構築できます。

特徴

  • 用途
    アニメーション、ゲームのフレーム更新、自動的な動作など。
  • 引数
    実行したい関数と、待ち時間をミリ秒で指定します。
  • 自動実行
    指定したミリ秒後に一度だけ、または繰り返し関数を実行できます。

コード例

import turtle
import random

screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.title("タイマーイベントでタートルが動く")

my_turtle = turtle.Turtle()
my_turtle.shape("circle")
my_turtle.color("red")
my_turtle.penup()

def move_randomly():
    x = random.randint(-280, 280)
    y = random.randint(-180, 180)
    my_turtle.goto(x, y)
    my_turtle.color(random.choice(["red", "green", "blue", "purple"]))
    # 2秒 (2000ミリ秒) 後に再度 move_randomly を呼び出す
    screen.ontimer(move_randomly, 2000) 

# 最初にタイマーイベントを開始
screen.ontimer(move_randomly, 2000)

turtle.done()

他のGUIライブラリとの連携 (高度な方法)

turtle モジュールは教育用であり、複雑なGUIアプリケーションの構築には向いていません。より高度で柔軟なインタラクションが必要な場合は、Pythonの他のGUIライブラリを検討することがあります。

  • Pygame / PyQt / Kivy など
    より高度なグラフィックやゲーム開発、複雑なユーザーインターフェースが必要な場合は、これらのライブラリが適しています。これらはそれぞれ独自のイベント処理システムを持っています。

  • Tkinter
    Python標準のGUIライブラリです。turtle モジュール自体がTkinterの上に構築されているため、Tkinterを直接使ってより詳細なイベント処理を行うことができます。例えば、TkinterのCanvasウィジェット上にタートルを描画し、Canvasのクリックイベントを処理する、といった方法です。

    特徴

    • 細かな制御
      ウィジェットの配置、イベントハンドリング、カスタム描画など、GUIのあらゆる側面を細かく制御できます。
    • 学習コスト
      turtle よりも学習コストは高くなります。
    import tkinter as tk
    import turtle as t_module # turtleモジュールとTkinterの競合を避けるため別名でインポート
    
    def setup_turtle_on_tkinter_canvas(root):
        canvas = tk.Canvas(root, width=600, height=400, bg="white")
        canvas.pack()
    
        # TkinterのCanvasにturtleスクリーンを埋め込む
        screen = t_module.Screen()
        screen.setup(width=600, height=400) # この設定はCanvasサイズと一致させる
        screen.setcanvas(canvas) # ここでturtleスクリーンをTkinterのCanvasに設定
    
        my_turtle = t_module.Turtle()
        my_turtle.shape("turtle")
        my_turtle.color("red")
    
        # TkinterのCanvasクリックイベントハンドラ
        def canvas_click_handler(event):
            # Tkinterのイベントオブジェクトから座標を取得
            x, y = event.x - canvas.winfo_width()/2, canvas.winfo_height()/2 - event.y
            print(f"Canvasがクリックされました! Tkinter座標: ({event.x}, {event.y}), Turtle座標: ({x}, {y})")
            my_turtle.goto(x, y)
            my_turtle.dot(15, "blue")
    
        canvas.bind("<Button-1>", canvas_click_handler) # 左クリックにバインド
    
        return my_turtle, screen
    
    if __name__ == "__main__":
        root = tk.Tk()
        root.title("Tkinter + Turtle")
    
        # turtleのイベントループをTkinterのメインループと統合する必要がある
        # そのためには、turtle.done() の代わりに Tkinter の mainloop() を使う
        # そして、turtle の listen() も必要になる
    
        my_turtle, screen = setup_turtle_on_tkinter_canvas(root)
    
        # turtle のイベントリスナーを有効にする (キーボードイベントなどに必要)
        screen.listen() 
    
        # Tkinterのメインループを開始
        root.mainloop() 
    
  • より高度なGUIやインタラクション
    Tkinterや他のGUIライブラリを検討
  • 時間による自動処理
    turtle.Screen().ontimer()
  • キーボード入力
    turtle.Screen().onkey() (onkeypress(), onkeyrelease()) + screen.listen()
  • 画面全体のクリック
    turtle.Screen().onclick() (または onscreenclick())
  • 特定のタートルのクリック
    turtle.onclick()