Python Class 使用 Turtle 对象不适用于 Windows,适用于 Linux
Python Class Utilizing Turtle object not working on Windows, Works on Linux
下面的代码在 Linux 机器上执行良好,但在 Windows 上不起作用。我不知道为什么。
我也尝试了添加 d.getscreen().mainloop()
的建议答案,但无济于事。该代码已在两台不同的 windows 机器上进行了测试。
import turtle
import time
class Display(turtle.Turtle):
def __init__(self):
turtle.Turtle.__init__(self)
self.screen = self.getscreen()
self.hideturtle()
self.speed(0)
self.screen.tracer(0)
self.screen.colormode(255)
def koch(self, order, size):
# self.forward(size)
# self.left(order)
if order == 0:
self.forward(size)
return
else:
for angle in [60, -120, 60, 0]:
self.koch(order - 1, size / 3)
self.left(angle)
def clearscreen(self):
self.clear()
def moveTurtle(self, x=50, y=50):
self.goto(self.xcor() - x, self.ycor() + 50)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
size = input("What size do you want your fractal? ")
if order == '' or size == '':
prompt = False
else:
d.koch(int(order), int(size))
d.penup()
d.moveTurtle()
d.pendown()
if __name__ == '__main__':
main()
您似乎是在函数范围内初始化 d 变量,然后试图在外部访问它。所以你需要在全局范围内分配变量,或者将它们作为参数传递给你的函数(或者在你的主函数下完成)。
我还注意到您在调用 main 函数之前初始化了 while 循环。我看到您没有在代码完成后调用 Screen 循环对代码执行任何操作。
如果您怀疑问题出在您的 Windows 机器上,请尝试 运行 turtle 演示,看看是否可以打开 turtle window。命令是:python -m turtledemo
我会做出的改变(并在 Windows 10、Ubuntu 16.04 中测试)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
size = input("What size do you want your fractal? ")
if order == '' or size == '':
prompt = False
else:
d.koch(int(order), int(size))
d.penup()
d.moveTurtle()
d.pendown()
d.getscreen().mainloop()
if __name__ == '__main__':
main()
我猜问题出在这里:
self.screen.tracer(0)
您关闭了图形并且再也没有打开它们。这需要在某个时候跟随:
self.screen.tracer(1)
或:
self.screen.update()
或两者。
出于测试目的,将其完全注释掉。某些操作会导致更新发生(例如 penup()
),但这可能是特定于实现的以及您 运行 所反对的。
我对您的代码进行了修改以合并上述内容和一些样式更改:
from turtle import Turtle
class Display(Turtle):
def __init__(self):
Turtle.__init__(self, visible=False)
self.screen = self.getscreen()
self.speed('fastest')
def koch(self, order, size):
if order == 0:
self.forward(size)
return
for angle in [60, -120, 60, 0]:
self.koch(order - 1, size / 3)
self.left(angle)
def moveTurtle(self, x=50, y=50):
self.goto(self.xcor() - x, self.ycor() + y)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
if order == '':
prompt = False
continue
size = input("What size do you want your fractal? ")
if size == '':
prompt = False
continue
d.screen.tracer(False)
d.koch(int(order), int(size))
d.screen.tracer(True)
d.penup()
d.moveTurtle()
d.pendown()
if __name__ == '__main__':
main()
下面的代码在 Linux 机器上执行良好,但在 Windows 上不起作用。我不知道为什么。
我也尝试了添加 d.getscreen().mainloop()
的建议答案,但无济于事。该代码已在两台不同的 windows 机器上进行了测试。
import turtle
import time
class Display(turtle.Turtle):
def __init__(self):
turtle.Turtle.__init__(self)
self.screen = self.getscreen()
self.hideturtle()
self.speed(0)
self.screen.tracer(0)
self.screen.colormode(255)
def koch(self, order, size):
# self.forward(size)
# self.left(order)
if order == 0:
self.forward(size)
return
else:
for angle in [60, -120, 60, 0]:
self.koch(order - 1, size / 3)
self.left(angle)
def clearscreen(self):
self.clear()
def moveTurtle(self, x=50, y=50):
self.goto(self.xcor() - x, self.ycor() + 50)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
size = input("What size do you want your fractal? ")
if order == '' or size == '':
prompt = False
else:
d.koch(int(order), int(size))
d.penup()
d.moveTurtle()
d.pendown()
if __name__ == '__main__':
main()
您似乎是在函数范围内初始化 d 变量,然后试图在外部访问它。所以你需要在全局范围内分配变量,或者将它们作为参数传递给你的函数(或者在你的主函数下完成)。
我还注意到您在调用 main 函数之前初始化了 while 循环。我看到您没有在代码完成后调用 Screen 循环对代码执行任何操作。
如果您怀疑问题出在您的 Windows 机器上,请尝试 运行 turtle 演示,看看是否可以打开 turtle window。命令是:python -m turtledemo
我会做出的改变(并在 Windows 10、Ubuntu 16.04 中测试)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
size = input("What size do you want your fractal? ")
if order == '' or size == '':
prompt = False
else:
d.koch(int(order), int(size))
d.penup()
d.moveTurtle()
d.pendown()
d.getscreen().mainloop()
if __name__ == '__main__':
main()
我猜问题出在这里:
self.screen.tracer(0)
您关闭了图形并且再也没有打开它们。这需要在某个时候跟随:
self.screen.tracer(1)
或:
self.screen.update()
或两者。
出于测试目的,将其完全注释掉。某些操作会导致更新发生(例如 penup()
),但这可能是特定于实现的以及您 运行 所反对的。
我对您的代码进行了修改以合并上述内容和一些样式更改:
from turtle import Turtle
class Display(Turtle):
def __init__(self):
Turtle.__init__(self, visible=False)
self.screen = self.getscreen()
self.speed('fastest')
def koch(self, order, size):
if order == 0:
self.forward(size)
return
for angle in [60, -120, 60, 0]:
self.koch(order - 1, size / 3)
self.left(angle)
def moveTurtle(self, x=50, y=50):
self.goto(self.xcor() - x, self.ycor() + y)
def main():
d = Display()
prompt = True
while prompt:
order = input("What order do you want your fractal? ")
if order == '':
prompt = False
continue
size = input("What size do you want your fractal? ")
if size == '':
prompt = False
continue
d.screen.tracer(False)
d.koch(int(order), int(size))
d.screen.tracer(True)
d.penup()
d.moveTurtle()
d.pendown()
if __name__ == '__main__':
main()