<p>我同意@VasuDeo.S(+1)关于你眼前问题的回答。但是,我发现您的代码中存在一些更微妙的问题:</p>
<ul>
<li><p>当涉及到你的网格时,你的指令是“写一个嵌套的
循环“但是你的两个循环是连续的而不是嵌套的。</p></li>
<li><p>当与海龟一起工作时,<code>goto()</code>用于大跳跃(和摆脱阻塞)。对于较小的移动,我们倾向于使用<code>forward()</code>、<code>backward()</code>、<code>left()</code>和<code>right()</code>否则使用turtle和传统的线描图形包没有区别。</p></li>
<li><p>您的<code>self.posx</code>和<code>self.posy</code>实例变量除了作为方便的局部变量外,没有其他用途。它们不保存从一种方法传递到另一种方法的状态。我们可以消除它们作为实例变量。</p></li>
<li><p>让对象的实例方法依赖名为“kel”的全局turtle似乎很奇怪,将turtle传递给它的构造函数或让它自己创建一个更合理。</p></li>
<li><p>您可以在设计中更多地利用<em>对称性</em>,以减少绘制它们所需的代码量。</p></li>
</ul>
<p>我已经在下面的代码中解决了上述问题。(我省略了您的图像代码,因为它当前未处于活动状态。)</p>
<pre><code>from turtle import Screen, Turtle
class DrawPattern():
def __init__(self, size):
self.size = size
self.turtle = Turtle()
self.turtle.speed("fastest")
def draw_grid(self, init_x, init_y):
''' Draw a grid '''
self.turtle.penup()
self.turtle.goto(init_x, init_y)
for _ in range(2):
for _ in range(7):
self.turtle.pendown()
self.turtle.forward(self.size * 6)
self.turtle.backward(self.size * 6)
self.turtle.left(90)
self.turtle.penup()
self.turtle.forward(self.size)
self.turtle.right(90)
self.turtle.right(90)
self.turtle.forward(self.size)
def repeat_shape(self, iter_x, iter_y):
if iter_x < 3 > iter_y:
self.draw_shape(iter_x * 180, iter_y * 180)
self.turtle.right(90)
self.repeat_shape(iter_x + 1, iter_y)
self.repeat_shape(iter_x, iter_y + 1)
def draw_shape(self, init_x, init_y):
''' Recursive method to draw repeating shape '''
# Draw yellow portion
self.turtle.penup()
self.turtle.goto(init_x, init_y)
self.turtle.setheading(90)
self.turtle.pendown()
self.turtle.fillcolor("yellow")
self.turtle.begin_fill()
for _ in range(4):
self.turtle.forward(self.size * 6)
self.turtle.right(90)
self.turtle.end_fill()
# Draw red portion
self.turtle.penup()
self.turtle.goto(init_x, init_y + self.size * 2)
self.turtle.setheading(0)
self.turtle.pendown()
self.turtle.fillcolor("red")
self.turtle.begin_fill()
for _ in range(4):
self.turtle.left(45)
self.turtle.forward(42)
self.turtle.left(90)
self.turtle.forward(42)
self.turtle.right(135)
self.turtle.forward(self.size * 2)
self.turtle.left(90)
self.turtle.forward(self.size * 2)
self.turtle.left(180)
self.turtle.end_fill()
# object instance of class DrawPattern
obj = DrawPattern(30)
obj.draw_grid(-200, -200)
obj.repeat_shape(0, 0)
screen = Screen()
screen.exitonclick()
</code></pre>