Python 取3到5个位置参数,但给出了6个?
我的程序应该使用用户输入绘制棋盘。绘图必须在调用draw时进行。我得到一个错误: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 问题是我的主模块无法更改。我不得不让它保持原样。这是一项要求。那么,当我不能改变
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修复,当我修复您的代码时,我尝试尽可能少地修改代码,以便您了解问题所在。请看一下这本书。