Python turtle中如何用if和onkeypress实现按不同键绘制多边形与外接圆
Mac环境下Python turtle多边形绘制工具按键交互实现方案
问题根因
你遇到的Tkinter回调异常核心是turtle.onkeypress是回调注册函数,本身没有可用于逻辑判断的返回值,不能直接通过if onkeypress(...)的方式触发业务逻辑。另外Mac环境不需要依赖msvcrt这类Windows专属按键监听库,turtle底层基于跨平台的Tkinter实现,自带的按键事件机制完全适配Mac系统。
实现思路
- 全局维护
current_sides变量,存储最后一次选中的正多边形边数,未选中时按o键不执行操作 - 为数字键3/4/5/6分别绑定正多边形绘制回调,绘制完成后自动更新
current_sides取值 - 为o键绑定外接圆绘制回调,回调内部根据
current_sides的取值匹配对应参数绘制外接圆
可运行代码示例
import turtle # 初始化画布和画笔 screen = turtle.Screen() screen.title("多边形绘制工具") pen = turtle.Turtle() pen.speed(2) # 全局变量存储当前选中的多边形边数 current_sides = 0 # 自定义不同多边形的外接圆参数,可按需修改 CIRCLE_CONFIG = { 3: {"radius": 100, "color": "red"}, 4: {"radius": 120, "color": "blue"}, 5: {"radius": 90, "color": "green"}, 6: {"radius": 110, "color": "purple"} } def draw_regular_polygon(n): """绘制指定边数的正多边形""" global current_sides pen.clear() pen.penup() pen.goto(0, 0) pen.setheading(0) pen.pendown() # 计算边长,也可以自定义固定边长 side_length = 2 * CIRCLE_CONFIG[n]["radius"] * (3.1415926 / n) for _ in range(n): pen.forward(side_length) pen.left(360 / n) # 更新当前选中的边数 current_sides = n def draw_circumcircle(): """绘制当前多边形的外接圆""" global current_sides if current_sides not in CIRCLE_CONFIG: return config = CIRCLE_CONFIG[current_sides] pen.penup() # 移动到圆的绘制起点(圆心正下方) pen.goto(0, -config["radius"]) pen.pendown() pen.pencolor(config["color"]) pen.circle(config["radius"]) # 恢复画笔颜色为黑色,避免影响后续多边形绘制 pen.pencolor("black") # 绑定按键事件 screen.onkeypress(lambda: draw_regular_polygon(3), "3") screen.onkeypress(lambda: draw_regular_polygon(4), "4") screen.onkeypress(lambda: draw_regular_polygon(5), "5") screen.onkeypress(lambda: draw_regular_polygon(6), "6") screen.onkeypress(draw_circumcircle, "o") # 启动按键监听,Mac环境下需点击画布窗口获得焦点后按键才会生效 screen.listen() turtle.mainloop()
注意事项
- 如果Homebrew安装的Python运行时报Tk相关错误,执行
brew install python-tk安装依赖即可 - 外接圆的半径、颜色等参数可直接修改
CIRCLE_CONFIG配置项自定义,不需要调整业务逻辑 - 运行代码后需要先点击弹出的turtle画布窗口,让窗口获得焦点,按键才能正常触发
内容的提问来源于stack exchange,提问作者Jeon JI No
相关产品推荐
相关产品推荐

