问题描述
我刚刚开始使用graphics.py,并试图下一些大雨。
x.map(i=>s+=i,s=0)
我认为我遇到的问题是,随着每个新矩形的添加,移动更新正在发生。 谁能帮助我提出更好的方法?
解决方法
我的建议是忘记autoflush
和update()
,直到您使算法以最快的速度运行。具体来说,您最终会得到3000个要更新的矩形,即使一次屏幕上显示的矩形永远不会超过15个。摆脱掉落在底部的矩形可能会更好:
from random import seed,randint,choice
from graphics import *
WIDTH,HEIGHT = 800,800
colorList = [
color_rgb(255,170,204),color_rgb(255,187,204,221,238,204)
]
def main():
seed()
win = GraphWin("Random Squares",WIDTH,HEIGHT)
win.setBackground("black")
rects = []
for _ in range(3000):
for rect in list(rects): # iterate over a shallow copy
rect.move(0,randint(10,100))
if rect.getP1().getY() > HEIGHT:
rect.undraw()
rects.remove(rect)
x1 = randint(0,WIDTH - 5)
y1 = randint(0,10)
rect = Rectangle(Point(x1,y1),Point(x1 + 5,y1 + 20))
rect.setFill(choice(colorList))
rect.draw(win)
rects.append(rect)
win.getMouse()
win.close()
if __name__ == '__main__':
main()
现在,我们仅跟踪约15个矩形,而不是数百个或数千个。仅在优化算法后,如果性能不符合您的意愿,请考虑使用autoflush
和update()
:
def main():
seed()
win = GraphWin("Random Squares",HEIGHT,autoflush=False)
win.setBackground("black")
rects = []
for _ in range(3000):
for rect in list(rects): # iterate over a shallow copy
rect.move(0,y1 + 20))
rect.setFill(choice(colorList))
rect.draw(win)
update()
rects.append(rect)
win.getMouse()
win.close()