Python turtle project producing error: object has no attribute
Python turtle project producing error: object has no attribute
我正在尝试完成我的 Python 课程的期末项目。要求如下:
- 使用基于对象编程的概念——类、对象和
方法
- 绘制二维形状
- 开发递归算法绘制递归形状
- 编写一个嵌套循环来处理二维网格
我已经编写了一些代码,但我无法在 turtle 屏幕中生成结果:
import turtle
from PIL import Image
kel = turtle.Turtle()
class Draw_pattern(object):
def __init__(self,posx,posy,size):
self.posx = posx
self.posy = posy
self.size = size
def draw_grid(self,initx, inity):
# Drawing grid
kel.penup()
kel.color("black")
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posy = self.posy+self.size;
self.posx = initx;
kel.penup()
self.posx = initx;
self.posy = inity;
kel.left(90)
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posx = self.posx+self.size;
self.posy = inity;
kel.penup()
def draw_shape(self,initx, inity):
self.posx = initx;
self.posy = inity;
# Drawing yellow portion
kel.penup()
kel.goto(self.posx, self.posy)
kel.pendown()
kel.fillcolor("yellow")
kel.begin_fill()
kel.goto(self.posx, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy)
kel.goto(self.posx, self.posy)
kel.end_fill()
# Drawing red portion
kel.penup()
kel.goto(self.posx, self.posy+self.size*2)
kel.pendown()
kel.fillcolor("red")
kel.begin_fill()
kel.goto(self.posx+self.size, self.posy+self.size*3)
kel.goto(self.posx, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*6)
kel.goto(self.posx+self.size*3, self.posy+self.size*5)
kel.goto(self.posx+self.size*4, self.posy+self.size*6)
kel.goto(self.posx+self.size*4, self.posy+self.size*4)
kel.goto(self.posx+self.size*6, self.posy+self.size*4)
kel.goto(self.posx+self.size*5, self.posy+self.size*3)
kel.goto(self.posx+self.size*6, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy)
kel.goto(self.posx+self.size*3, self.posy+self.size)
kel.goto(self.posx+self.size*2, self.posy)
kel.goto(self.posx+self.size*2, self.posy+self.size*2)
kel.goto(self.posx, self.posy+self.size*2)
kel.end_fill()
# recursive function to draw repeating shape
def repeat_shape(self,intx, inty):
if intx>=3 | inty>=3:
return
else:
self.draw_shape(intx*180, inty*180)
kel.right(90)
self.repeat_shape(intx+1,inty)
self.repeat_shape(intx,inty+1)
class image_play(object):
def __init__(self,im_name):
self.im_name = im_name
def rgb_to_gray_image(self):
im = Image.open(self.im_name)
im = im.convert('LA')
# editing pixels of image to white
def loop_over_image(self):
im = Image.open(self.im_name)
width, height = im.size
# nested loop over all pixels of image
for i in range(width):
for j in range(height):
im[i][j] = 255;
kel.speed("fastest")
# object of class Draw_pattern
obj = Draw_pattern(0,0,30)
obj.draw_grid(0,0)
obj.repeat_shape(0,0)
AttributeErrorTraceback (most recent call last)
<ipython-input-14-8b7bbac27093> in <module>
103 obj = Draw_pattern(0,0,30)
104 obj.draw_grid(0,0)
--> 105 obj.repeat_shape(0,0)
AttributeError: 'Draw_pattern' object has no attribute 'repeat_shape'
尝试:
import turtle
from PIL import Image
kel = turtle.Turtle()
class Draw_pattern(object):
def __init__(self,posx,posy,size):
self.posx = posx
self.posy = posy
self.size = size
def draw_grid(self,initx, inity):
# Drawing grid
kel.penup()
kel.color("black")
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posy = self.posy+self.size;
self.posx = initx;
kel.penup()
self.posx = initx;
self.posy = inity;
kel.left(90)
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posx = self.posx+self.size;
self.posy = inity;
kel.penup()
def repeat_shape(self, intx, inty):
if intx>=3 | inty>=3:
return
else:
self.draw_shape(intx*180, inty*180)
kel.right(90)
self.repeat_shape(intx+1, inty)
self.repeat_shape(intx, inty+1)
def draw_shape(self,initx, inity):
self.posx = initx;
self.posy = inity;
# Drawing yellow portion
kel.penup()
kel.goto(self.posx, self.posy)
kel.pendown()
kel.fillcolor("yellow")
kel.begin_fill()
kel.goto(self.posx, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy)
kel.goto(self.posx, self.posy)
kel.end_fill()
# Drawing red portion
kel.penup()
kel.goto(self.posx, self.posy+self.size*2)
kel.pendown()
kel.fillcolor("red")
kel.begin_fill()
kel.goto(self.posx+self.size, self.posy+self.size*3)
kel.goto(self.posx, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*6)
kel.goto(self.posx+self.size*3, self.posy+self.size*5)
kel.goto(self.posx+self.size*4, self.posy+self.size*6)
kel.goto(self.posx+self.size*4, self.posy+self.size*4)
kel.goto(self.posx+self.size*6, self.posy+self.size*4)
kel.goto(self.posx+self.size*5, self.posy+self.size*3)
kel.goto(self.posx+self.size*6, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy)
kel.goto(self.posx+self.size*3, self.posy+self.size)
kel.goto(self.posx+self.size*2, self.posy)
kel.goto(self.posx+self.size*2, self.posy+self.size*2)
kel.goto(self.posx, self.posy+self.size*2)
kel.end_fill()
# recursive function to draw repeating shape
class image_play(object):
def __init__(self,im_name):
self.im_name = im_name
def rgb_to_gray_image(self):
im = Image.open(self.im_name)
im = im.convert('LA')
# editing pixels of image to white
def loop_over_image(self):
im = Image.open(self.im_name)
width, height = im.size
# nested loop over all pixels of image
for i in range(width):
for j in range(height):
im[i][j] = 255;
kel.speed("fastest")
# object of class Draw_pattern
obj = Draw_pattern(0,0,30)
obj.draw_grid(0,0)
obj.repeat_shape(0, 0)
您在 class 之外声明了一些 class 函数,并试图将它们作为 class 函数调用,这导致了错误。
我同意@VasuDeo.S (+1) 对您当前问题的回答。但是,我发现您的代码存在一些更微妙的问题:
当谈到你的网格时,你的说明说,“写一个嵌套的
loop" 但你的两个循环是 sequential 而不是 nested.
使用乌龟时,goto()
用于大跳跃(并摆脱困境)。对于较小的运动,我们倾向于使用forward()
、backward()
、left()
和right()
,否则使用turtle和常规的线图图形包没有区别。
您的 self.posx
和 self.posy
实例变量除了作为方便的局部变量外没有任何用途。它们不保存从一种方法到另一种方法的状态。我们可以将它们作为实例变量消除。
让你的对象的实例方法依赖于名为 'kel' 的全局海龟似乎很奇怪——将海龟传递给它的构造函数或让它创建一个更有意义它自己的。
您可以在设计中更多地利用 对称性 来减少绘制它们所需的代码量。
我在修改下面的 your/Vasu 代码时解决了上述问题。 (我遗漏了您的图像代码,因为它目前未激活。)
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()
我正在尝试完成我的 Python 课程的期末项目。要求如下:
- 使用基于对象编程的概念——类、对象和 方法
- 绘制二维形状
- 开发递归算法绘制递归形状
- 编写一个嵌套循环来处理二维网格
我已经编写了一些代码,但我无法在 turtle 屏幕中生成结果:
import turtle
from PIL import Image
kel = turtle.Turtle()
class Draw_pattern(object):
def __init__(self,posx,posy,size):
self.posx = posx
self.posy = posy
self.size = size
def draw_grid(self,initx, inity):
# Drawing grid
kel.penup()
kel.color("black")
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posy = self.posy+self.size;
self.posx = initx;
kel.penup()
self.posx = initx;
self.posy = inity;
kel.left(90)
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posx = self.posx+self.size;
self.posy = inity;
kel.penup()
def draw_shape(self,initx, inity):
self.posx = initx;
self.posy = inity;
# Drawing yellow portion
kel.penup()
kel.goto(self.posx, self.posy)
kel.pendown()
kel.fillcolor("yellow")
kel.begin_fill()
kel.goto(self.posx, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy)
kel.goto(self.posx, self.posy)
kel.end_fill()
# Drawing red portion
kel.penup()
kel.goto(self.posx, self.posy+self.size*2)
kel.pendown()
kel.fillcolor("red")
kel.begin_fill()
kel.goto(self.posx+self.size, self.posy+self.size*3)
kel.goto(self.posx, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*6)
kel.goto(self.posx+self.size*3, self.posy+self.size*5)
kel.goto(self.posx+self.size*4, self.posy+self.size*6)
kel.goto(self.posx+self.size*4, self.posy+self.size*4)
kel.goto(self.posx+self.size*6, self.posy+self.size*4)
kel.goto(self.posx+self.size*5, self.posy+self.size*3)
kel.goto(self.posx+self.size*6, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy)
kel.goto(self.posx+self.size*3, self.posy+self.size)
kel.goto(self.posx+self.size*2, self.posy)
kel.goto(self.posx+self.size*2, self.posy+self.size*2)
kel.goto(self.posx, self.posy+self.size*2)
kel.end_fill()
# recursive function to draw repeating shape
def repeat_shape(self,intx, inty):
if intx>=3 | inty>=3:
return
else:
self.draw_shape(intx*180, inty*180)
kel.right(90)
self.repeat_shape(intx+1,inty)
self.repeat_shape(intx,inty+1)
class image_play(object):
def __init__(self,im_name):
self.im_name = im_name
def rgb_to_gray_image(self):
im = Image.open(self.im_name)
im = im.convert('LA')
# editing pixels of image to white
def loop_over_image(self):
im = Image.open(self.im_name)
width, height = im.size
# nested loop over all pixels of image
for i in range(width):
for j in range(height):
im[i][j] = 255;
kel.speed("fastest")
# object of class Draw_pattern
obj = Draw_pattern(0,0,30)
obj.draw_grid(0,0)
obj.repeat_shape(0,0)
AttributeErrorTraceback (most recent call last)
<ipython-input-14-8b7bbac27093> in <module>
103 obj = Draw_pattern(0,0,30)
104 obj.draw_grid(0,0)
--> 105 obj.repeat_shape(0,0)
AttributeError: 'Draw_pattern' object has no attribute 'repeat_shape'
尝试:
import turtle
from PIL import Image
kel = turtle.Turtle()
class Draw_pattern(object):
def __init__(self,posx,posy,size):
self.posx = posx
self.posy = posy
self.size = size
def draw_grid(self,initx, inity):
# Drawing grid
kel.penup()
kel.color("black")
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posy = self.posy+self.size;
self.posx = initx;
kel.penup()
self.posx = initx;
self.posy = inity;
kel.left(90)
for i in range(7):
kel.goto(self.posx, self.posy)
kel.pendown()
kel.forward(self.size*6)
self.posx = self.posx+self.size;
self.posy = inity;
kel.penup()
def repeat_shape(self, intx, inty):
if intx>=3 | inty>=3:
return
else:
self.draw_shape(intx*180, inty*180)
kel.right(90)
self.repeat_shape(intx+1, inty)
self.repeat_shape(intx, inty+1)
def draw_shape(self,initx, inity):
self.posx = initx;
self.posy = inity;
# Drawing yellow portion
kel.penup()
kel.goto(self.posx, self.posy)
kel.pendown()
kel.fillcolor("yellow")
kel.begin_fill()
kel.goto(self.posx, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy+self.size*6)
kel.goto(self.posx+self.size*6, self.posy)
kel.goto(self.posx, self.posy)
kel.end_fill()
# Drawing red portion
kel.penup()
kel.goto(self.posx, self.posy+self.size*2)
kel.pendown()
kel.fillcolor("red")
kel.begin_fill()
kel.goto(self.posx+self.size, self.posy+self.size*3)
kel.goto(self.posx, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*4)
kel.goto(self.posx+self.size*2, self.posy+self.size*6)
kel.goto(self.posx+self.size*3, self.posy+self.size*5)
kel.goto(self.posx+self.size*4, self.posy+self.size*6)
kel.goto(self.posx+self.size*4, self.posy+self.size*4)
kel.goto(self.posx+self.size*6, self.posy+self.size*4)
kel.goto(self.posx+self.size*5, self.posy+self.size*3)
kel.goto(self.posx+self.size*6, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy+self.size*2)
kel.goto(self.posx+self.size*4, self.posy)
kel.goto(self.posx+self.size*3, self.posy+self.size)
kel.goto(self.posx+self.size*2, self.posy)
kel.goto(self.posx+self.size*2, self.posy+self.size*2)
kel.goto(self.posx, self.posy+self.size*2)
kel.end_fill()
# recursive function to draw repeating shape
class image_play(object):
def __init__(self,im_name):
self.im_name = im_name
def rgb_to_gray_image(self):
im = Image.open(self.im_name)
im = im.convert('LA')
# editing pixels of image to white
def loop_over_image(self):
im = Image.open(self.im_name)
width, height = im.size
# nested loop over all pixels of image
for i in range(width):
for j in range(height):
im[i][j] = 255;
kel.speed("fastest")
# object of class Draw_pattern
obj = Draw_pattern(0,0,30)
obj.draw_grid(0,0)
obj.repeat_shape(0, 0)
您在 class 之外声明了一些 class 函数,并试图将它们作为 class 函数调用,这导致了错误。
我同意@VasuDeo.S (+1) 对您当前问题的回答。但是,我发现您的代码存在一些更微妙的问题:
当谈到你的网格时,你的说明说,“写一个嵌套的 loop" 但你的两个循环是 sequential 而不是 nested.
使用乌龟时,
goto()
用于大跳跃(并摆脱困境)。对于较小的运动,我们倾向于使用forward()
、backward()
、left()
和right()
,否则使用turtle和常规的线图图形包没有区别。您的
self.posx
和self.posy
实例变量除了作为方便的局部变量外没有任何用途。它们不保存从一种方法到另一种方法的状态。我们可以将它们作为实例变量消除。让你的对象的实例方法依赖于名为 'kel' 的全局海龟似乎很奇怪——将海龟传递给它的构造函数或让它创建一个更有意义它自己的。
您可以在设计中更多地利用 对称性 来减少绘制它们所需的代码量。
我在修改下面的 your/Vasu 代码时解决了上述问题。 (我遗漏了您的图像代码,因为它目前未激活。)
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()