我想使用turtle
制作这张图片,
这是我到目前为止的内容,但是有多个错误。
import turtle
import colorsys
import random
def draw_circle(x,y,r,color):
turtle.up()
turtle.seth(0)
turtle.goto(x,y-r)
turtle.down()
turtle.fillcolor(color)
turtle.begin_fill()
turtle.circle(r)
turtle.end_fill()
def draw_square(x,y):
turtle.up()
turtle.seth(0)
turtle.goto(x,y)
turtle.fillcolor(color)
turtle.pencolor(color)
turtle.down()
turtle.begin_fill()
for i in range(2):
turtle.fd(w)
turtle.left(90)
turtle.fd(h)
turtle.left(90)
turtle.end_fill()
turtle.speed(0)
x = 0
y = -200
for i in range(100):
color = colorsys.hsv_to_rgb(x,1,1)
turtle.pencolor(color)
draw_square(x,y)
x += .01
y += 10
我收到此错误:
Traceback (most recent call last):
File "/Users/MBach/Documents/concentric squares.py", line 39, in <module>
draw_square(x,y)
File "/Users/MBach/Documents/concentric squares.py", line 24, in draw_square
turtle.fd(w)
NameError: name 'w' is not defined
>>>
答案 0 :(得分:1)
在等待@darksky解决方案完成时;-)我写了这个替代示例,它使用 stamping 而不是 drawing 来简化代码并加快图形处理: / p>
import turtle
import colorsys
STEP = 2 # distance between squares
WIDTH = 375 # width of the biggest square
CURSOR_SIZE = 20
def draw_square(width, color):
turtle.shapesize(width / CURSOR_SIZE)
turtle.pencolor(color)
turtle.stamp()
turtle.shape('square')
turtle.fillcolor('white')
hue = 0
for width in range(WIDTH, 0, -2 * STEP):
color = colorsys.hsv_to_rgb(hue, 1, 1)
draw_square(width, color)
hue += 0.01
turtle.done()
盖章并不是解决所有乌龟问题的方法,而是像这样的简单几何图形,它具有以下优点:
答案 1 :(得分:0)
除了缩进,这里还存在一些问题,表明您可能已经从某个地方随机粘贴了部分代码,而没有密切注意它的作用。例如,此for循环:
for i in range(2):
turtle.fd(w)
turtle.left(90)
turtle.fd(h)
turtle.left(90)
包含变量w
和h
,但是这些变量未在您的代码中定义。首先让我们了解如何绘制正方形。乌龟必须执行两个步骤:
要在不绘制任何内容的情况下到达坐标,我们必须用turtle.penup()
抬起笔,用turtle.goto()
到那里,用turtle.pendown()
放下笔。因此,您的draw_square
应该看起来像这样:
def draw_square(x, y, width):
turtle.penup()
turtle.goto(x, y)
turtle.pendown()
turtle.forward(width)
turtle.right(90)
turtle.forward(width)
turtle.right(90)
turtle.forward(width)
turtle.right(90)
turtle.forward(width)
turtle.right(90)
接下来,让我们看看您编写的第二个for循环:
x = 0
y = -200
for i in range(100):
color = colorsys.hsv_to_rgb(x, 1, 1)
turtle.pencolor(color)
draw_square(x, y)
x += .01
y += 10
您的想法有些正确。从x,y坐标开始,在每次迭代中更新它,更新颜色并绘制一个正方形。但是,有几个问题。首先,虽然x必须增加,但y实际上必须减少。这是因为当您从屏幕顶部移至底部时,y值会减小。其次,因为正方形是同心的,所以它们必须改变的数量必须相等。
让我们定义一个step
,即正方形之间的距离width
,正方形的大小,初始位置,我们必须确保hue
的增长速度比x和y。
step = 3 # distance between squares
width = 600 #width of the biggest square
x, y = -width / 2, width / 2
hue = 0
for i in range(100):
color = colorsys.hsv_to_rgb(hue, 1, 1)
turtle.pencolor(color)
draw_square(x, y, width)
x += step
y -= step
width -= 2 * step
hue += 0.01