Python Turtle.Terminator 即使在使用 exitonclick() 之后

Posted

技术标签:

【中文标题】Python Turtle.Terminator 即使在使用 exitonclick() 之后【英文标题】:Python Turtle.Terminator even after using exitonclick() 【发布时间】:2018-01-14 00:35:44 【问题描述】:

我已经尝试为turtle制作函数以使其非常容易绘制形状并且代码看起来像这样

import turtle as t

def square():
     tw = t.Screen()
     for i in range(4):
          t.forward(100)
          t.right(90)
     tw.exitonclick()
def triangle():
     tw = t.Screen()
     for i in range(3):
          t.forward(100)
          t.right(120)
     tw.exitonclick()
def star():
     tw = t.Screen()
     for i in range(5):
          t.forward(150)
          t.right(144)
     tw.exitonclick()

当我在 shell 中运行此代码时,出现问题...

>>> square()
>>> triangle()
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    triangle()
  File "C:\Users\Manop\Desktop\XENON\turtleg.py", line 11, in triangle
    t.forward(100)
  File "<string>", line 5, in forward
turtle.Terminator
>>> star()
>>> square()
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    square()
  File "C:\Users\Manop\Desktop\XENON\turtleg.py", line 5, in square
    t.forward(100)
  File "<string>", line 5, in forward
turtle.Terminator
>>> 

无法克服问题所在,因为我什至使用了 exitonclick()

【问题讨论】:

【参考方案1】:

我在做一个学校项目时遇到了同样的错误。 经过对海龟库的一些研究,我发现了一个名为 TurtleScreen._RUNNING 的变量,如果将此变量设置为 True,则会打开海龟窗口,否则会出现 turtle.Terminator 错误。 每次关闭一个turtle屏幕,TurtleScreen._RUNNING会自动设置为True,如果你想避免这种情况,你可以简单地写这行代码TurtleScreen._RUNNING = True(当然之前需要导入turtle)。

【讨论】:

【参考方案2】:

您的海龟程序结构不正确。你不需要这样做:

tw = t.Screen()
...
tw.exitonclick()

在每个函数中。 Screen()需要被调用一次; exitonclick() 应该只被调用一次。试试这个重组:

import turtle as t

def square():
    for i in range(4):
        t.forward(100)
        t.right(90)

def triangle():
    for i in range(3):
        t.forward(100)
        t.right(120)

def star():
    for i in range(5):
        t.forward(150)
        t.right(144)

t.penup()
t.goto(150, 150)
t.pendown()
square()

t.penup()
t.goto(-150, 150)
t.pendown()
triangle()

t.penup()
t.goto(150, -150)
t.pendown()
star()

screen = t.Screen()
screen.exitonclick()

如果您想以交互方式执行代码,也可以。只需在函数定义之后删除所有内容,以交互方式将其加载到 Python 中并执行以下操作:

>>> star()

或任何你想运行的东西。您不需要调用 Screen() 并且 exitonclick() 在交互工作时没有意义。

【讨论】:

不起作用(我已复制粘贴并按原样运行代码)。点击海龟屏幕上的任意位置——甚至多次——都会被忽略。 @Apostolos,绘制完成后,点击屏幕上的anywere干净地退出程序(在Python3中)。您似乎正在解决一个不同的问题:在绘图过程中可以随时干净地退出。我在 OP 的问题中没有看到任何暗示这种愿望的东西。虽然这是一个有趣的问题,但如果这是他真正想要的。 是的,只有在所有绘图完成后才可以。这是不行的,尤其是。以防绘图需要很长时间。请尝试下面的代码,看看您可以随时退出。【参考方案3】:

让 screen.exitonclick() 方法成为代码中的最后一条语句,不要缩进。

当您使用 Python IDE 时,如 Pycharm、Spyder 等,您会使用此方法。

不知道大家有没有听说过screen.mainloop()这个方法

此方法可让您在 Python IDE 中运行代码时查看其输出。

如果没有这个方法,你的输出会瞬间出现。

我重写了你的代码,这是我的

from turtle import Turtle

t=Turtle()

def square():
    t.up()
    t.setpos(-50,-50)
    t.down()
    for i in range(4):
        t.forward(100)
        t.right(90)

def triangle():
    t.up()
    t.setpos(50,50)
    t.down()
    for i in range(3):
        t.forward(100)
        t.right(120)

def star():
    t.up()
    t.setpos(-200,100)
    t.down()
    for i in range(5):
        t.forward(150)
        t.right(144)

square()
triangle()
star()
t.screen.exitonclick()

这是输出 output of my program

你也可以查看这个优秀的guide in Python turtle

【讨论】:

不起作用(我已复制粘贴并按原样运行代码)。点击海龟屏幕上的任意位置——甚至多次——都会被忽略。 无论如何它都可以在这里工作,谢谢!!! (python 3.8 in IDLE【参考方案4】:

当你中断海龟绘图时,它会生气并产生“异常终止”错误。使用“正在运行”标志随时停止进程:

from turtle import Turtle

t=Turtle()

def square():
    global running
    t.up()
    t.setpos(-50,-50)
    t.down()
    for i in range(4):
        if not running: break; # Check 'running' here
        t.forward(100)
        t.right(90)

def triangle():
    global running
    t.up()
    t.setpos(50,50)
    t.down()
    for i in range(3):
        if not running: break; # Check 'running' here
        t.forward(100)
        t.right(120)

def star():
    global running
    t.up()
    t.setpos(-200,100)
    t.down()
    for i in range(5):
        if not running: break; # Check 'running' here
        t.forward(150)
        t.right(144)

def stop(x,y): # x,y are dummy but they are requested
  global running
  running = False  # Disable running

t.screen.onclick(stop) # Set a function for 'running'

running = True  # Enable running

square()
triangle()
star()

我测试了上面的代码。终止一直很顺利。

【讨论】:

【参考方案5】:

我也遇到过同样的错误...在前导和括号之间添加空格。帮我解决了。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案6】:

这是因为 turtle 模块(目前大多数参考实现)使​​用一个名为 _RUNNING 的类变量。这在 exitonclick() 方法期间变为 false。

将您的代码更改为以下应该有助于以您想要的方式运行:

import turtle as t

def square():
    t.TurtleScreen._RUNNING=True
    tw = t.Screen()
    for i in range(4):
        t.forward(100)
        t.right(90)
    tw.exitonclick()

def triangle():
    t.TurtleScreen._RUNNING=True
    tw = t.Screen()
    for i in range(3):
        t.forward(100)
        t.right(120)
    tw.exitonclick()

def star():
    t.TurtleScreen._RUNNING=True
    tw = t.Screen()
    for i in range(5):
        t.forward(150)
        t.right(144)
    tw.exitonclick()

【讨论】:

以上是关于Python Turtle.Terminator 即使在使用 exitonclick() 之后的主要内容,如果未能解决你的问题,请参考以下文章

001--python全栈--基础知识--python安装

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python