有没有一种方法可以让turtle-graphics让我们改变填充颜色?

问题描述 投票:0回答:1

我想用这段分形代码做一个场景,我需要每秒钟改变填充颜色。我试过用for-loop来重画整个场景,但那会影响到我代码中其他不应该重复的部分。

有没有一种方法可以让我们改变填充颜色的Turtle-graphics?

from turtle import *
from time import sleep, perf_counter
tracer(0)
def hilbert(size, level, parity):
    if level == 0:
        return
    left(parity * 90)
    hilbert(size, level - 1, -parity)
    forward(size)
    right(parity * 90)
    hilbert(size, level - 1, parity)
    forward(size)
    hilbert(size, level - 1, parity)
    right(parity * 90)
    forward(size)
    hilbert(size, level - 1, -parity)
    left(parity * 90)
def fractal(dist, depth, dir):
    if depth < 1:
        fd(dist)
        return
    fractal(dist / 3, depth - 1, dir)
    lt(60 * dir)
    fractal(dist / 3, depth - 1, dir)
    rt(120 * dir)
    fractal(dist / 3, depth - 1, dir)
    lt(60 * dir)
    fractal(dist / 3, depth - 1, dir)
reset()
speed(0)
ht()
pu()
size = 6

setpos(-33*size, -32*size)
pd()
fillcolor("chocolate")
begin_fill()
fd(size)

hilbert(size, 6, 1)

fd(size)
for i in range(3):
    lt(90)
    fd(size*(64+i%2))
pu()
for i in range(2):
    fd(size)
    rt(90)
pd()
for i in range(4):
    fd(size*(66+i%2))
    rt(90)
end_fill()
update()

输出。

Fractals

python colors turtle-graphics scene fractals
1个回答
1
投票

将绘制代码封装在函数中,并添加一个计时器,在后台我们可以每秒钟用不同的背景颜色重新绘制一次。 这样你就可以在背景颜色变化的时候,自由的使用乌龟去画其他东西。

from turtle import Screen, Turtle
from itertools import cycle

COLORS = ['chocolate', 'tomato', 'plum', 'salmon', 'bisque', 'lime', 'olive', 'wheat']

size = 6

def hilbert(t, size, level, parity=1):
    if level == 0:
        return

    t.left(parity * 90)
    hilbert(t, size, level - 1, -parity)
    t.forward(size)
    t.right(parity * 90)
    hilbert(t, size, level - 1, parity)
    t.forward(size)
    hilbert(t, size, level - 1, parity)
    t.right(parity * 90)
    t.forward(size)
    hilbert(t, size, level - 1, -parity)
    t.left(parity * 90)

def filled_hilbert(t, color):
    t.clear()
    t.setheading(0)

    t.penup()
    t.setposition(-33 * size, -32 * size)
    t.pendown()

    t.fillcolor(next(color))
    t.begin_fill()

    t.forward(size)

    hilbert(t, size, 6, 1)

    t.forward(size)

    for i in range(3):
        t.left(90)
        t.forward(size * (64 + i % 2))

    t.penup()

    for i in range(2):
        t.forward(size)
        t.right(90)

    t.pendown()

    for i in range(4):
        t.forward(size * (66 + i % 2))
        t.right(90)

    t.end_fill()

    screen.update()

    screen.ontimer(lambda: filled_hilbert(t, color), 1000)

screen = Screen()
screen.tracer(0)

turtle = Turtle()
turtle.hideturtle()

filled_hilbert(turtle, cycle(COLORS))

screen.mainloop()

但是,任何正在画画的乌龟都会出现在前面,所以这张图片不一定会留在背景中,除非你同步你的forground画画。

© www.soinside.com 2019 - 2024. All rights reserved.