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

Python Turtle中如何监听窗口大小变化以重绘适配圆形?

解决Turtle窗口缩放时圆形适配问题

要实现窗口大小变化时自动重绘适配的圆形,核心是监听窗口尺寸变化事件,并在事件触发时重新计算参数、清除旧图形后重绘。下面是具体实现方案:

关键问题分析

你之前用s.screensize()获取的是Turtle的虚拟画布尺寸,并非窗口的实际显示尺寸,而且窗口缩放时这个值不会自动更新。另外,直接取较小边作为半径会导致圆形超出窗口边界——应该取窗口较小边的一半作为半径,才能让圆形完全适配窗口。

完整实现代码

import turtle

# 初始化turtle和screen
t = turtle.Turtle()
s = turtle.Screen()
t.speed(0)  # 最快绘制速度

def draw_circle(window_width, window_height):
    # 计算适配窗口的半径:取窗口宽高中较小值的一半,再减去笔宽的一半避免边缘被截断
    smaller_side = min(window_width, window_height)
    radius = (smaller_side // 2) - (t.pensize() // 2)
    
    # 清除旧图形
    t.clear()
    
    # 绘制新圆形
    t.pensize(15)
    t.penup()
    t.goto(0, -radius)
    t.pendown()
    t.circle(radius)
    t.penup()

def on_resize(event):
    # 获取窗口实际宽高(减去tkinter窗口边框的影响)
    window_width = event.width
    window_height = event.height
    draw_circle(window_width, window_height)

# 获取turtle底层的tkinter画布对象
canvas = t.getcanvas()
# 绑定窗口尺寸变化事件:每次窗口大小改变时触发on_resize
canvas.bind("<Configure>", on_resize)

# 初始绘制一次圆形
initial_width = canvas.winfo_width()
initial_height = canvas.winfo_height()
draw_circle(initial_width, initial_height)

# 启动主循环
turtle.done()

核心说明

  • 绑定窗口事件:通过t.getcanvas()获取底层tkinter画布,绑定<Configure>事件(窗口尺寸变化时触发),回调函数on_resize会接收事件对象,从中获取最新的窗口宽高。
  • 适配半径计算:取窗口较小边的一半,再减去笔宽的一半,避免圆形边缘被窗口边框截断。
  • 清除重绘:每次窗口变化时先调用t.clear()清除旧图形,再绘制新的适配圆形。

内容的提问来源于stack exchange,提问作者cd-CreepArghhh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:58:32