Python 避免turtle paint代码中的递归错误

Python 避免turtle paint代码中的递归错误,python,recursion,tkinter,turtle-graphics,Python,Recursion,Tkinter,Turtle Graphics,我正在创建一个简单的程序,在tkinter画布中使用turtle,允许用户使用鼠标进行绘制。绘图函数似乎工作正常,但在您绘制一段时间后,程序停止并调用RecursionError。 从海龟导入* 将tkinter作为tk导入 box=tk.tk() canv=滚动画布(框) canv.pack() 屏风=龟甲屏风(canv) p=原始海龟(屏幕) p、 速度(0) def提取(事件): p、 goto(event.x-256185-event.y)#数字在这里,因为否则海龟会偏离中心。可能因计

我正在创建一个简单的程序,在tkinter画布中使用turtle,允许用户使用鼠标进行绘制。绘图函数似乎工作正常,但在您绘制一段时间后,程序停止并调用RecursionError。

从海龟导入*
将tkinter作为tk导入
box=tk.tk()
canv=滚动画布(框)
canv.pack()
屏风=龟甲屏风(canv)
p=原始海龟(屏幕)
p、 速度(0)
def提取(事件):
p、 goto(event.x-256185-event.y)#数字在这里,因为否则海龟会偏离中心。可能因计算机而异。
可以绑定(“”,绘制)
box.mainloop()
这在理论上应该画得很好,但实际上它调用的是递归错误。除了在try循环中包装函数之外,我不知道我能做些什么来防止这种情况。任何帮助都将不胜感激。

Python Shell中的输出:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:\Users\Charlie\Desktop\demo.py", line 17, in draw
    p.speed(0)
  File "C:\Program Files (x86)\Python36-32\lib\turtle.py", line 2174, in speed
    self.pen(speed=speed)
  File "C:\Program Files (x86)\Python36-32\lib\turtle.py", line 2459, in pen
    self._update()
  File "C:\Program Files (x86)\Python36-32\lib\turtle.py", line 2660, in _update
    self._update_data()
  File "C:\Program Files (x86)\Python36-32\lib\turtle.py", line 2651, in _update_data
    self._pencolor, self._pensize)
  File "C:\Program Files (x86)\Python36-32\lib\turtle.py", line 545, in _drawline
    self.cv.coords(lineitem, *cl)
  File "<string>", line 1, in coords
RecursionError: maximum recursion depth exceeded while calling a Python object
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Program Files(x86)\Python36-32\lib\tkinter\\ uuuuu init\uuuuuu.py”,第1699行,在调用中__ 返回self.func(*args) 文件“C:\Users\Charlie\Desktop\demo.py”,第17行,在绘图中 p、 速度(0) 文件“C:\ProgramFiles(x86)\Python36-32\lib\turtle.py”,第2174行,速度 self.pen(速度=速度) 文件“C:\Program Files(x86)\Python36-32\lib\turtle.py”,第2459行,钢笔 自我更新() 文件“C:\ProgramFiles(x86)\Python36-32\lib\turtle.py”,第2660行,在更新中 自我更新数据() 文件“C:\Program Files(x86)\Python36-32\lib\turtle.py”,第2651行,在更新数据中 自我.(铅笔色,自我.) 文件“C:\Program Files(x86)\Python36-32\lib\turtle.py”,第545行,在绘图线中 自我简历协调(行项目,*cl) 文件“”,第1行,在坐标中 RecursionError:调用Python对象时超出了最大递归深度
我花了很多时间四处寻找答案,据我所知,在任何地方都不容易找到答案。这是我在这个网站上的第一个问题,如果我做错了什么,请原谅。

我无法重现你的递归错误,但我以前见过它。通常在事件处理程序忙于处理事件时出现新事件的情况下。(这就是它看起来像递归的原因。)通常的修复方法是关闭事件处理程序中的事件处理程序。尝试一下,看看它是否更适合您:

from turtle import RawTurtle, ScrolledCanvas, TurtleScreen
import tkinter as tk

box = tk.Tk()

canv = ScrolledCanvas(box)
canv.pack()

screen = TurtleScreen(canv)

p = RawTurtle(screen)
p.speed('fastest')

def draw(x, y):
    p.ondrag(None)
    p.setheading(p.towards(x, y))
    p.goto(x, y)
    p.ondrag(draw)

p.ondrag(draw)

box.mainloop()

遇到此错误时,我通常会导入sys模块,调用
sys.setrecursionlimit()
我在括号中放了一个很大的数字。这将使recursionlimit更高,您很可能不会再次遇到此错误

下面是经过编辑的脚本,我希望它对您有用

从海龟导入*
将tkinter作为tk导入
导入系统
系统设置递归限制(10000)
box=tk.tk()
canv=滚动画布(框)
canv.pack()
屏风=龟甲屏风(canv)
p=原始海龟(屏幕)
p、 速度(0)
def提取(事件):
p、 goto(event.x-256185-event.y)#数字在这里,因为否则海龟会偏离中心。可能因计算机而异。
可以绑定(“”,绘制)
box.mainloop()

我不知道为什么,但它在
速度(0)
方面有一些问题。可能只使用一次,outside
draw()
移动了它,但它仍然调用了一个错误-当我在这里编写它时,还忘了更改绑定。这个问题只有在拖动鼠标时才会出现。谢谢你的帮助,但回头看,我意识到绑定应该是“”,但我写了“”。如果运行编辑的代码,您可以看到我所指的错误。再次感谢。@CharlesD.,我已经相应地更新了我的示例。你需要点击海龟本身,而不仅仅是屏幕上的某个地方,来拖动它。非常感谢!这应该能很好地满足我的目的。
from turtle import RawTurtle, ScrolledCanvas, TurtleScreen
import tkinter as tk

box = tk.Tk()

canv = ScrolledCanvas(box)
canv.pack()

screen = TurtleScreen(canv)

p = RawTurtle(screen)
p.speed('fastest')

def draw(x, y):
    p.ondrag(None)
    p.setheading(p.towards(x, y))
    p.goto(x, y)
    p.ondrag(draw)

p.ondrag(draw)

box.mainloop()