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
相关产品推荐
相关产品推荐

