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() 之后的主要内容,如果未能解决你的问题,请参考以下文章