Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 取3到5个位置参数,但给出了6个?_Python_Python 3.x - Fatal编程技术网

Python 取3到5个位置参数,但给出了6个?

Python 取3到5个位置参数,但给出了6个?,python,python-3.x,Python,Python 3.x,我的程序应该使用用户输入绘制棋盘。绘图必须在调用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 问题是我的主模块无法更改。我不得不让它保持原样。这是一项要求。那么,当我不能改变

我的程序应该使用用户输入绘制棋盘。绘图必须在调用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()

谢谢你的帮助

每个类方法(包括init)的第一个参数始终是对类的当前实例的引用。按照惯例,此参数始终命名为self。在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()

每个类方法(包括init)的第一个参数始终是对类的当前实例的引用。按照惯例,此参数始终命名为self。在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()

主函数传递给棋盘的第一个参数是一个turtle.turtle对象。您没有考虑这个对象。您应该将这个turtle对象转换为类的实例变量,并使用它来绘制东西。主函数传递给棋盘的第一个参数是。您没有考虑这个对象。你应该把这个海龟对象变成你的类的一个实例变量,并用它来画东西。OP说他们不允许改变主变量module@Ahmed你的代码根本不起作用。我假设您忘记了必须在def u drawRectangle上添加self才能使self.tr工作,所以我更改了它,现在在主棋盘中得到第20行。draw TypeError:draw缺少2个必需的位置参数:“chessboard u startX”和“chessboard u startY”。@User3230修复,当我修复您的代码时,我尝试尽可能少地修改代码,以便您了解问题所在。请看一下。OP说他们不允许改变主管道module@Ahmed你的代码根本不起作用。我假设您忘记了必须在def u drawRectangle上添加self才能使self.tr工作,所以我更改了它,现在在主棋盘中得到第20行。draw TypeError:draw缺少2个必需的位置参数:“chessboard u startX”和“chessboard u startY”。@User3230修复,当我修复您的代码时,我尝试尽可能少地修改代码,以便您了解问题所在。请看一下这本书。