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