如何将 graphics.py 点的列表作为参数传递给 Polygon()?
How can I pass a List of graphics.py Points as an argument to Polygon()?
我正在开发一个简单的程序,使用 Python 3.6 和 Zelle 的 graphics.py 绘制房子。
我正在使用 Notepad++ 作为编辑器。
我的任务要求已经全部完成,但是有规定,如果加了风景,可以加分。我最初想添加从我画的房子的烟囱里冒出来的烟。
我尝试创建一个点列表,它看起来像这样:
Smoke = []
for i in range(1, 30):
Smoke.append(Point(554 + i, i**2 / 3))
for j in range(31, 80):
Smoke.append(Point(554 + j, Smoke[j - 1] + 100 / j))
for k in range(79, -1, -1)
Smoke.append(Smoke[k])
这个问题是我想在附加它之前更改 Smoke[k] 的 'y' 参数,所以我决定创建两个列表:
SmokeX = []
SmokeY = []
for i in range (1, 30):
SmokeX.append(Point(554 + i))
SmokeY.append(Point(i**2 / 3))
for j in range (31, 80):
SmokeX.append(Point(554 + j))
SmokeY.append(Point(SmokeY[j - 1] + 100 / j))
for k in range (79, -1, -1):
SmokeX.append(Point(554 + k))
SmokeY.append(Point(SmokeY[k] + 50))
那些没有像我一样在 01:00 上午查看此内容的人会认识到我的两个列表实际上毫无意义(双关语),因为它们没有两个参数。由于我无法将任何一个参数设置为 NULL,因此我放弃了这种方法。
最后,我试着只存储数字,而不是点,希望 Polygon() 能接受这些。我已经打开 graphics.py 并发现 Polygon() 是一个非常严格的霸主,并且只会将点作为参数,而不是数字。这是我的完整 house.py 文件以供参考。
from graphics import *
from math import *
def main():
#Initialization
win = GraphWin("House", 800, 800)
win.setBackground(color_rgb(191, 191, 191))
#Main House
HouseBody = Rectangle(Point(100, 300), Point(700, 700))
HouseBody.setFill(color_rgb(96, 96, 96))
#Roof
HouseRoof = Polygon(Point(100, 300), Point(700, 300), Point(400, 200))
HouseRoof.setFill(color_rgb(255, 127, 0))
#Windows
HouseWindowLeft = Circle(Point(200, 450), 60)
HouseWindowLeft.setFill(color_rgb(0, 191, 255))
HouseWindowLeftBarV = Rectangle(Point(198, 390), Point(202, 510))
HouseWindowLeftBarV.setFill(color_rgb(0, 0, 0))
HouseWindowLeftBarH = Rectangle(Point(140, 448), Point(260, 452))
HouseWindowLeftBarH.setFill(color_rgb(0, 0, 0))
HouseWindowRight = Circle(Point(600, 450), 60)
HouseWindowRight.setFill(color_rgb(0, 191, 255))
HouseWindowRightBarV = Rectangle(Point(598, 390), Point(602, 510))
HouseWindowRightBarV.setFill(color_rgb(0, 0, 0))
HouseWindowRightBarH = Rectangle(Point(540, 448), Point(660, 452))
HouseWindowRightBarH.setFill(color_rgb(0, 0, 0))
#Door
HouseDoor = Rectangle(Point(350, 500), Point(450, 700))
HouseDoor.setFill(color_rgb(255, 0, 0))
HouseDoorKnob = Circle(Point(440, 630), 5)
HouseDoorKnob.setFill(color_rgb(0, 0, 0))
#Chimney
HouseChimney = Polygon(Point(550, 250), Point (550, 200), Point(600, 200), Point(600, 267))
HouseChimney.setFill(color_rgb(0, 127, 127))
#Additional Scenery - Smoke
SmokeX = []
SmokeY = []
for i in range (1, 30):
SmokeX.append(554 + i)
SmokeY.append(i**2 / 3)
for j in range (31, 80):
SmokeX.append(554 + j)
SmokeY.append(SmokeY[j - 1] + 100 / j)
for k in range (79, -1, -1):
SmokeX.append(554 + k)
SmokeY.append(SmokeY[k] + 50)
HouseSmoke = Polygon(SmokeX, SmokeY)
HouseSmoke.setFill(color_rgb(255, 255, 255))
#Drawing to Screen
HouseBody.draw(win)
HouseRoof.draw(win)
HouseWindowLeft.draw(win)
HouseWindowLeftBarV.draw(win)
HouseWindowLeftBarH.draw(win)
HouseWindowRight.draw(win)
HouseWindowRightBarV.draw(win)
HouseWindowRightBarH.draw(win)
HouseDoor.draw(win)
HouseDoorKnob.draw(win)
HouseChimney.draw(win)
HouseSmoke.draw(win)
win.getMouse()
win.close()
main()
目前我也遇到了越界索引错误,尽管我可能可以自行解决。我现在真的很好奇如何生成点列表 [],然后将它们传递给 Polygon() 以便使用 graphics.py 绘制形状。如有任何意见,我们将不胜感激!
您可以这样编写 Smoke 循环,将您的点列表作为 Polygon() 的参数展开
Smoke = []
for i in range(1, 30):
Smoke.append(Point(554 + i, i**2 / 3))
for j in range(29, 80):
Smoke.append(Point(554 + j, Smoke[j - 1].getY() + 100 / j))
for k in range(79, -1, -1):
Smoke.append(Point(554 + k, Smoke[k].getY() + 50))
HouseSmoke = Polygon(*Smoke)
您的索引问题在这里:
for i in range (1, 30):
...
SmokeY.append(i**2 / 3)
这会在数组 SmokeY 中创建索引位置 0 - 28(范围是 1 到 29,但数组从 0 开始)。但是下一个子句试图访问 SmokeY 中不存在的索引位置 30(29 也不存在):
for j in range (31, 80):
...
SmokeY.append(SmokeY[j - 1] + 100 / j)
您在计算数组索引时需要更加小心。
我正在开发一个简单的程序,使用 Python 3.6 和 Zelle 的 graphics.py 绘制房子。 我正在使用 Notepad++ 作为编辑器。
我的任务要求已经全部完成,但是有规定,如果加了风景,可以加分。我最初想添加从我画的房子的烟囱里冒出来的烟。
我尝试创建一个点列表,它看起来像这样:
Smoke = []
for i in range(1, 30):
Smoke.append(Point(554 + i, i**2 / 3))
for j in range(31, 80):
Smoke.append(Point(554 + j, Smoke[j - 1] + 100 / j))
for k in range(79, -1, -1)
Smoke.append(Smoke[k])
这个问题是我想在附加它之前更改 Smoke[k] 的 'y' 参数,所以我决定创建两个列表:
SmokeX = []
SmokeY = []
for i in range (1, 30):
SmokeX.append(Point(554 + i))
SmokeY.append(Point(i**2 / 3))
for j in range (31, 80):
SmokeX.append(Point(554 + j))
SmokeY.append(Point(SmokeY[j - 1] + 100 / j))
for k in range (79, -1, -1):
SmokeX.append(Point(554 + k))
SmokeY.append(Point(SmokeY[k] + 50))
那些没有像我一样在 01:00 上午查看此内容的人会认识到我的两个列表实际上毫无意义(双关语),因为它们没有两个参数。由于我无法将任何一个参数设置为 NULL,因此我放弃了这种方法。
最后,我试着只存储数字,而不是点,希望 Polygon() 能接受这些。我已经打开 graphics.py 并发现 Polygon() 是一个非常严格的霸主,并且只会将点作为参数,而不是数字。这是我的完整 house.py 文件以供参考。
from graphics import *
from math import *
def main():
#Initialization
win = GraphWin("House", 800, 800)
win.setBackground(color_rgb(191, 191, 191))
#Main House
HouseBody = Rectangle(Point(100, 300), Point(700, 700))
HouseBody.setFill(color_rgb(96, 96, 96))
#Roof
HouseRoof = Polygon(Point(100, 300), Point(700, 300), Point(400, 200))
HouseRoof.setFill(color_rgb(255, 127, 0))
#Windows
HouseWindowLeft = Circle(Point(200, 450), 60)
HouseWindowLeft.setFill(color_rgb(0, 191, 255))
HouseWindowLeftBarV = Rectangle(Point(198, 390), Point(202, 510))
HouseWindowLeftBarV.setFill(color_rgb(0, 0, 0))
HouseWindowLeftBarH = Rectangle(Point(140, 448), Point(260, 452))
HouseWindowLeftBarH.setFill(color_rgb(0, 0, 0))
HouseWindowRight = Circle(Point(600, 450), 60)
HouseWindowRight.setFill(color_rgb(0, 191, 255))
HouseWindowRightBarV = Rectangle(Point(598, 390), Point(602, 510))
HouseWindowRightBarV.setFill(color_rgb(0, 0, 0))
HouseWindowRightBarH = Rectangle(Point(540, 448), Point(660, 452))
HouseWindowRightBarH.setFill(color_rgb(0, 0, 0))
#Door
HouseDoor = Rectangle(Point(350, 500), Point(450, 700))
HouseDoor.setFill(color_rgb(255, 0, 0))
HouseDoorKnob = Circle(Point(440, 630), 5)
HouseDoorKnob.setFill(color_rgb(0, 0, 0))
#Chimney
HouseChimney = Polygon(Point(550, 250), Point (550, 200), Point(600, 200), Point(600, 267))
HouseChimney.setFill(color_rgb(0, 127, 127))
#Additional Scenery - Smoke
SmokeX = []
SmokeY = []
for i in range (1, 30):
SmokeX.append(554 + i)
SmokeY.append(i**2 / 3)
for j in range (31, 80):
SmokeX.append(554 + j)
SmokeY.append(SmokeY[j - 1] + 100 / j)
for k in range (79, -1, -1):
SmokeX.append(554 + k)
SmokeY.append(SmokeY[k] + 50)
HouseSmoke = Polygon(SmokeX, SmokeY)
HouseSmoke.setFill(color_rgb(255, 255, 255))
#Drawing to Screen
HouseBody.draw(win)
HouseRoof.draw(win)
HouseWindowLeft.draw(win)
HouseWindowLeftBarV.draw(win)
HouseWindowLeftBarH.draw(win)
HouseWindowRight.draw(win)
HouseWindowRightBarV.draw(win)
HouseWindowRightBarH.draw(win)
HouseDoor.draw(win)
HouseDoorKnob.draw(win)
HouseChimney.draw(win)
HouseSmoke.draw(win)
win.getMouse()
win.close()
main()
目前我也遇到了越界索引错误,尽管我可能可以自行解决。我现在真的很好奇如何生成点列表 [],然后将它们传递给 Polygon() 以便使用 graphics.py 绘制形状。如有任何意见,我们将不胜感激!
您可以这样编写 Smoke 循环,将您的点列表作为 Polygon() 的参数展开
Smoke = []
for i in range(1, 30):
Smoke.append(Point(554 + i, i**2 / 3))
for j in range(29, 80):
Smoke.append(Point(554 + j, Smoke[j - 1].getY() + 100 / j))
for k in range(79, -1, -1):
Smoke.append(Point(554 + k, Smoke[k].getY() + 50))
HouseSmoke = Polygon(*Smoke)
您的索引问题在这里:
for i in range (1, 30):
...
SmokeY.append(i**2 / 3)
这会在数组 SmokeY 中创建索引位置 0 - 28(范围是 1 到 29,但数组从 0 开始)。但是下一个子句试图访问 SmokeY 中不存在的索引位置 30(29 也不存在):
for j in range (31, 80):
...
SmokeY.append(SmokeY[j - 1] + 100 / j)
您在计算数组索引时需要更加小心。