занимает от 3 до 5 позиционных аргументов, но 6 были даны? - PullRequest
1 голос
/ 10 ноября 2019

Моя программа должна рисовать шахматную доску, используя пользовательский ввод. Рисование должно происходить с вызовом draw (). Я получаю сообщение об ошибке:

line 18, in main
 chessboard = Chessboard(tr, startX, startY, eval(width),  val(height)) 
TypeError: __init__() takes from 3 to 5 positional arguments but 6 were given

Дело в том, что мой основной модуль не может изменить . Я должен оставить все как есть. Это требование. Итак, как я могу решить эту проблему, когда я ничего не могу изменить от нее? Это дает мне только ошибку в строке 18.

основной модуль:

import turtle
from chessboard import Chessboard

def main():
    startX, startY = eval(input("Enter a starting point: "))
    width = input("Input a width: ")
    height = input("Input a height: ")

    tr = turtle.Turtle()

    if width == "" and height == "":
        chessboard = Chessboard(tr, startX, startY)
    elif height == "":
        chessboard = Chessboard(tr, startX, startY, width=eval(width))
    elif width == "":
        chessboard = Chessboard(tr, startX, startY, height=eval(height))
    else:
        chessboard = Chessboard(tr, startX, startY, eval(width), eval(height))

        chessboard.draw()

        tr.hideturtle()
        turtle.done()

main()

Я оставляю свой модуль chessboard.py на случай, если с ним что-то нужно сделать:

import turtle


class Chessboard:
    def __init__(self, startX, startY, width=250, height=250):
        self.__startX = startX
        self.__startY = startY
        self.__width = width
        self.__height = height

    def draw(self, __startX, __startY, __width=250, __height=250):
        turtle.clear
        self.__drawChessboard(__startX, __startY, __width, __height)

    def __drawChessboard(self, __startX, __startY, __width=250, __height=250):
        # uses height x width, default 250
        turtle.setheading(0)  
        turtle.penup() 
        turtle.goto(__startX, __startY) 
        turtle.pendown() 
        turtle.goto(__startX + __width, __startY)
        turtle.goto(__startX + __width, __startY + __height)
        turtle.goto(__startX, __startY + __height)
        turtle.goto(__startX, __startY)

        self.__drawAllRectangles(self, __startX, __startY, __width, __height)

        turtle.exitonclick()

    def __drawAllRectangles(self, __startX, __startY, __width, __height):
        __checkerWidth = __width / 8
        __checkerHeight = __height / 8
        for row in range(8):
            for column in range(4):
                if row % 2 == 0:
                    self.__drawRectangle(self, __startX + (2 * column * __checkerWidth),
                                         __startY + (row * __checkerHeight), __checkerWidth, __checkerHeight)
                else:
                    self.__drawRectangle(self, __startX + __checkerWidth + (2 * column * __checkerWidth),
                                         __startY + (row * __checkerHeight), __checkerWidth, __checkerHeight)

    def __drawRectangle(self, __startX, __startY, __checkerWidth, __checkerHeight):
        turtle.penup()
        turtle.setheading(0)
        turtle.goto(__startX, __startY)
        turtle.fillcolor("black")
        turtle.begin_fill()
        turtle.pendown()
        turtle.goto(__startX + __checkerWidth, __startY)
        turtle.goto(__startX + __checkerWidth, __startY + __checkerHeight)
        turtle.goto(__startX, __startY + __checkerHeight)
        turtle.goto(__startX, __startY)
        turtle.end_fill()

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 10 ноября 2019

Первый аргумент каждого метода класса, включая init, всегда является ссылкой на текущий экземпляр класса. По соглашению этот аргумент всегда называется «я». В методе init self ссылается на вновь созданный объект;в других методах класса это относится к экземпляру, метод которого был вызван.

РЕДАКТИРОВАТЬ: я не читал ту часть, где вы сказали, что вы не можете изменить основной модуль, я извиняюсь

class Chessboard:
    def __init__(self, tr, startX, startY, width=250, height=250):
        self.tr = tr
        self.__startX = startX
        self.__startY = startY
        self.__width = width
        self.__height = height

    def draw(self):
        self.tr.clear()
        self.__drawChessboard(self.__startX, self.__startY, self.__width, self.__height)

    def __drawChessboard(self, __startX, __startY, __width=250, __height=250):
        # uses height x width, default 250
        self.tr.setheading(0)  
        self.tr.penup() 
        self.tr.goto(__startX, __startY) 
        self.tr.pendown() 
        self.tr.goto(__startX + __width, __startY)
        self.tr.goto(__startX + __width, __startY + __height)
        self.tr.goto(__startX, __startY + __height)
        self.tr.goto(__startX, __startY)

        self.__drawAllRectangles(__startX, __startY, __width, __height)

        self.tr.exitonclick()

    def __drawAllRectangles(self, __startX, __startY, __width, __height):
        __checkerWidth = __width / 8
        __checkerHeight = __height / 8
        for row in range(8):
            for column in range(4):
                if row % 2 == 0:
                    self.__drawRectangle(__startX + (2 * column * __checkerWidth),
                                         __startY + (row * __checkerHeight), __checkerWidth, __checkerHeight)
                else:
                    self.__drawRectangle(__startX + __checkerWidth + (2 * column * __checkerWidth),
                                         __startY + (row * __checkerHeight), __checkerWidth, __checkerHeight)

    def __drawRectangle(self, __startX, __startY, __checkerWidth, __checkerHeight):
        self.tr.penup()
        self.tr.setheading(0)
        self.tr.goto(__startX, __startY)
        self.tr.fillcolor("black")
        self.tr.begin_fill()
        self.tr.pendown()
        self.tr.goto(__startX + __checkerWidth, __startY)
        self.tr.goto(__startX + __checkerWidth, __startY + __checkerHeight)
        self.tr.goto(__startX, __startY + __checkerHeight)
        self.tr.goto(__startX, __startY)
        self.tr.end_fill()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...