在 Python 中多次创建海龟对象

Creating turtle object many times in Python

我正在使用Python Turtle-graphics画一些数字。但是,一旦屏幕关闭,我就无法再次创建它。

例如,以下简单代码有效:

import turtle
t = turtle.Turtle()
t.speed(0)
t.dot()
t.goto(100, 100)
turtle.done()

但是,在下面的代码中,第二次绘制时出现错误:

import turtle

# FIRST DRAWING: 
t = turtle.Turtle()
t.speed(0)
t.dot()
t.goto(100, 100)
turtle.done()

# SECOND DRAWING: 
t = turtle.Turtle()        # ERROR OCCURS HERE WHEN FIRST WINDOW IS CLOSED.
t.speed(0)
t.dot()
t.goto(-100, -100)
turtle.done()

错误是:

Traceback (most recent call last):
  File "rptTurtle.py", line 12, in <module>
    t = turtle.Turtle()
  File "/usr/lib/python3.7/turtle.py", line 3816, in __init__
    visible=visible)
  File "/usr/lib/python3.7/turtle.py", line 2557, in __init__
    self._update()
  File "/usr/lib/python3.7/turtle.py", line 2660, in _update
    self._update_data()
  File "/usr/lib/python3.7/turtle.py", line 2646, in _update_data
    self.screen._incrementudc()
  File "/usr/lib/python3.7/turtle.py", line 1292, in _incrementudc
    raise Terminator
turtle.Terminator

问题出在哪里,如何解决?

Standalone Python Turtle 没有设计为一旦退出就重新启动。您可以通过在 tkinter 程序中使用 embedded turtle 来解决这个问题。不过,不退出turtle,而是reset()屏幕重新画图似乎更简单。

下面的例子放上你的第一张图,如果你在屏幕上点击鼠标按钮,它会重置屏幕并放上你的第二张图:

from turtle import Screen, Turtle

def first_drawing():
    turtle = Turtle()
    turtle.speed('fastest')
    turtle.dot()
    turtle.goto(100, 100)

def second_drawing():
    turtle = Turtle()
    turtle.speed('fastest')
    turtle.dot()
    turtle.goto(-100, -100)

def switch(x, y):
    screen.onclick(None)
    screen.reset()
    second_drawing()

screen = Screen()
screen.onclick(switch)

first_drawing()

screen.mainloop()

我们可以修改它以使用 list 绘图函数处理任意数量的绘图。

由于您在评论中特别要求执行“第一幅图”和“第二幅图”样式,请在下面找到解决方案:

1)

import importlib
import turtle

# FIRST DRAWING: 
t = turtle.Turtle()
t.speed(0)
t.dot()
t.goto(100, 100)
turtle.done()
importlib.reload(turtle)

# SECOND DRAWING: 
t = turtle.Turtle() 
t.speed(0)
t.dot()
t.goto(-100, -100)
turtle.done()

import turtle

# FIRST DRAWING: 
t = turtle.Turtle()
t.speed(0)
t.dot()
t.goto(100, 100)
turtle.done()

# SECOND DRAWING: 
turtle.TurtleScreen._RUNNING=True
t = turtle.Turtle() 
t.speed(0)
t.dot()
t.goto(-100, -100)
turtle.done()