【问题标题】:Avoid RecursionError in turtle paint code避免海龟绘制代码中的 RecursionError
【发布时间】:2017-12-07 01:15:43
【问题描述】:

我正在创建一个简单的程序,它在 tkinter 画布中使用 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 循环中之外,我不知道我能做些什么来防止这种情况发生。任何帮助将非常感激。

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

我花了很多时间四处寻找答案,据我所知,没有一个容易找到的地方。这是我在这个网站上的第一个问题,如果我做错了什么,请原谅我。

【问题讨论】:

  • 我不知道为什么,但speed(0) 有一些问题。可能只用一次,在draw()之外@
  • 移动了它,它仍然调用一个错误 - 当我在这里写它时也忘记更改绑定。该问题仅在拖动鼠标时出现。

标签: python recursion tkinter turtle-graphics


【解决方案1】:

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

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()

【讨论】:

  • 感谢您的帮助,但我意识到回想起来绑定应该是“”,但我写的是“”。如果您运行编辑后的代码,您会看到我所指的错误。再次感谢您。
  • @CharlesD.,我已经相应地更新了我的示例。您需要单击海龟本身,而不仅仅是屏幕上的某个位置,以拖动它。
  • 非常感谢!这应该可以很好地满足我的目的。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多