Python Turtle Project выдает ошибку: объект не имеет атрибута - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь завершить окончательный проект для моего курса Python.Требования следующие:

  1. Использование концепций объектно-ориентированного программирования - классов, объектов и методов
  2. Рисование двумерной фигуры
  3. Разработка рекурсивных алгоритмоврисовать рекурсивные фигуры
  4. Написать вложенный цикл для обработки двумерной сетки

Я написал некоторый код, но у меня возникли проблемы с получением результата для отображения на экране черепахи:

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'

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Я согласен с ответом @ VasuDeo.S (+1) относительно вашей непосредственной проблемы. Однако, я вижу некоторые более тонкие проблемы с вашим кодом:

  • Когда дело доходит до вашей сетки, ваши инструкции говорят: «напишите вложенный loop ", но ваши два цикла последовательные не вложенные .

  • При работе с черепахой, goto() используется для больших прыжков (и для выхода из варенья). Для небольших движений мы склонны использовать forward(), backward(), left() и right(), иначе нет никакой разницы между использованием черепахи и обычного графического пакета для рисования линий.

  • Ваши переменные экземпляра self.posx и self.posy не служат никакой цели, кроме удобных локальных переменных. Они не сохраняют состояния, которое переносится из одного метода в другой. Мы можем исключить их как переменные экземпляра.

  • Кажется странным, что методы экземпляра вашего объекта полагаются на глобальную черепаху с именем 'kel' - более разумно было бы передать черепаху ее конструктору или создать ее самостоятельно.

  • Вы можете воспользоваться преимуществами симметрии в своих проектах, чтобы уменьшить количество кода, необходимого для их отрисовки.

Я рассмотрел вышеуказанные проблемы, переделав код вашего / Васу ниже. (Я пропустил ваш код изображения, так как он в данный момент не активен.)

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()
1 голос
/ 26 мая 2019

Попробуйте:

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)

Вы объявили некоторую функцию класса вне класса и попытались вызвать их как функцию класса, которая вызвала ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...