You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在turtle库中为圆形图形绑定点击清除屏幕事件?

解决Turtle圆形点击清屏的问题

你的代码里turtle.onclick()没生效的核心原因是:这个方法绑定的是海龟自身位置的点击事件,而非整个圆形图形的点击区域。画完圆后海龟停在圆的右侧边缘,只有点击这个位置才会触发,点击圆的其他区域没用。

下面是修正后的代码,通过全局屏幕点击监听+坐标判断的方式实现点击任意圆形清屏:

# -*- coding: utf-8 -*-
import random
import turtle
import math

circles = []  # 存储所有圆形的圆心坐标和半径

class Figure:
    def __init__(self):
        __colors = ['red', 'green', 'yellow', 'purple', 'orange']
        __figures = ['square', 'circle', 'triangle']
        self.__x = random.randint(-330, 330)
        self.__y = random.randint(-230, 230)
        self.__color = random.choice(__colors)
        self.figure_type = None  # 记录当前图形类型
        self.t = turtle.Turtle()
        self.t.hideturtle()
        self.t.fillcolor(self.__color)
        self.t.up()
        self.t.setpos(self.__x, self.__y)
        self.t.down()
        __choose = random.choice(__figures)
        if __choose == 'square':
            self.figure_type = 'square'
            self.square()
        elif __choose == 'circle':
            self.figure_type = 'circle'
            self.radius = 50
            circles.append((self.__x, self.__y, self.radius))  # 把圆形信息加入列表
            self.circle()
        else:
            self.figure_type = 'triangle'
            self.triangle()

    def square(self):
        self.t.begin_fill()
        for i in range(4):
            self.t.fd(50)
            self.t.left(90)
        self.t.end_fill()

    def circle(self):
        self.t.begin_fill()
        self.t.circle(self.radius)
        self.t.end_fill()

    def triangle(self):
        self.t.begin_fill()
        self.t.fd(50)
        self.t.lt(120)
        self.t.fd(50)
        self.t.lt(120)
        self.t.fd(50)
        self.t.end_fill()

def check_click(x, y):
    # 计算点击点与每个圆形的距离,判断是否在圆内
    for (cx, cy, r) in circles:
        distance = math.hypot(x - cx, y - cy)
        if distance <= r:
            turtle.clearscreen()
            return

turtle.tracer(1, 0)

for i in range(10):
    Figure()

turtle.onscreenclick(check_click)  # 绑定全局屏幕点击事件

turtle.mainloop()

关键修改说明:

  • 新增circles列表,存储所有圆形的圆心坐标和半径,方便后续判断点击位置。
  • 在Figure类中添加figure_type属性标记当前图形类型;圆形额外保存半径,并将圆心+半径存入circles。
  • 定义check_click函数,通过勾股定理计算点击点到圆心的距离,若距离小于等于半径则判定点击了圆形,执行清屏。
  • 使用turtle.onscreenclick()绑定全局屏幕点击事件,替代原来的海龟局部点击。

这样修改后,点击任意圆形的区域都会触发清屏操作,符合需求。

内容的提问来源于stack exchange,提问作者RD60

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:45:14