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

tkinter中使用turtle绘制正多边形出现窗口弹出、报错、光标不停止问题

问题修复方案

核心问题根因

  • 绘图对象调用错误:创建了绑定Canvas的RawTurtle实例re_po,但后续绘图调用了全局turtle对象,全局对象默认生成独立turtle窗口
  • 死循环逻辑错误:循环判断条件为n!=0,但循环体内将n赋值为1,导致循环永远不会终止,光标持续移动
  • 方法误用:嵌入场景调用了仅独立turtle窗口适用的turtle.done(),阻塞tkinter事件循环,导致Canvas对象被销毁后仍然执行绘图命令,触发TclError和Terminator报错

修复后完整代码

from tkinter import *
import turtle # 导入放到全局,不要放在函数内重复导入

root = Tk()
root.title("도형 그리기")

def buttonclick3():
    # 清空画布上次绘制的内容
    cv.delete("all")
    # 创建绑定到tkinter Canvas的turtle实例
    re_po = turtle.RawTurtle(cv)
    # 隐藏绘制完成后的光标,可按需删除
    re_po.hideturtle()

    n = int(ent_N.get())
    angle = 360 / n
    side = 100

    # 修复循环逻辑,绘制n次后终止
    for _ in range(n):
        re_po.forward(side)
        re_po.left(angle)

lb5 = Label(root, text="3.정N각형 그리기")
lb6 = Label(root, text="N을 입력하세요.")

ent_N = Entry(root, width=70)
bt3 = Button(root, text="정다각형 그리기", command=buttonclick3)
cv = Canvas(root, width=700, height=700, bg="white")

lb5.grid(row=8, column=0)
lb6.grid(row=9, column=0, columnspan=3)
ent_N.grid(row=10, column=0, columnspan=3)
bt3.grid(row=11, column=0, columnspan=3)
cv.grid(row=12, column=0, columnspan=3)

root.mainloop()

关键修改说明

  • 将turtle的导入移到全局位置,避免函数重复触发时重复导入
  • 所有绘图操作改为调用绑定Canvas的re_po实例,不再使用全局turtle对象,图形直接绘制在tkinter内置画布上,不会弹出独立窗口
  • 把死循环改为for循环执行n次,绘制完成后自动终止,不会出现光标持续移动的问题
  • 删除了turtle.done()调用,避免阻塞tkinter的事件循环
  • 新增cv.delete("all"),每次点击绘制前清空画布,避免多次绘制内容重叠
  • 可选添加re_po.hideturtle(),绘制完成后隐藏光标,视觉效果更整洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:06:04