避免海龟绘制代码中的 RecursionError
Avoid RecursionError in turtle paint code
我正在创建一个简单的程序,该程序在 tkinter canvas 中使用 turtle 以允许用户使用鼠标进行绘制。绘图功能似乎工作正常,但是在您绘制了一点之后程序停止并调用 RecursionError。
from turtle import *
import tkinter as tk
box=tk.Tk()
canv=ScrolledCanvas(box)
canv.pack()
screen=TurtleScreen(canv)
p=RawTurtle(screen)
p.speed(0)
def draw(event):
p.goto(event.x-256,185-event.y) #The numbers are here because otherwise the turtle draws off center. Might be different depending on computer.
canv.bind('<B1-Motion>', draw)
box.mainloop()
这在理论上应该可以很好地绘制,但它却调用了 RecursionError。除了可能将函数包装在 try 循环中之外,我不知道我能做些什么来防止这种情况发生。任何帮助将非常感激。
PythonShell中的输出:
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
我花了很多时间四处寻找答案,据我所知,在任何地方都不容易找到答案。这是我在这个网站上的第一个问题,如果我做错了什么,请原谅我。
我无法重现你的递归错误,但我以前见过。通常在事件处理程序忙于处理事件时有新事件传入的情况。 (这就是它看起来像递归的原因。)通常的解决方法是关闭事件处理程序内部的事件处理程序。试试这个,看看它是否更适合你:
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()
我正在创建一个简单的程序,该程序在 tkinter canvas 中使用 turtle 以允许用户使用鼠标进行绘制。绘图功能似乎工作正常,但是在您绘制了一点之后程序停止并调用 RecursionError。
from turtle import *
import tkinter as tk
box=tk.Tk()
canv=ScrolledCanvas(box)
canv.pack()
screen=TurtleScreen(canv)
p=RawTurtle(screen)
p.speed(0)
def draw(event):
p.goto(event.x-256,185-event.y) #The numbers are here because otherwise the turtle draws off center. Might be different depending on computer.
canv.bind('<B1-Motion>', draw)
box.mainloop()
这在理论上应该可以很好地绘制,但它却调用了 RecursionError。除了可能将函数包装在 try 循环中之外,我不知道我能做些什么来防止这种情况发生。任何帮助将非常感激。
PythonShell中的输出:
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
我花了很多时间四处寻找答案,据我所知,在任何地方都不容易找到答案。这是我在这个网站上的第一个问题,如果我做错了什么,请原谅我。
我无法重现你的递归错误,但我以前见过。通常在事件处理程序忙于处理事件时有新事件传入的情况。 (这就是它看起来像递归的原因。)通常的解决方法是关闭事件处理程序内部的事件处理程序。试试这个,看看它是否更适合你:
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()