python玩与学 | 有你好看
公益教程 | 代码俱乐部 | 玩物励志
有的时候只要拓展下你的想象力,就能做出意想不到的效果。当然,最好的办法还是读别人的代码,然后总结经验,变成你的。
看一个国外网友所做的“Laser Beam”——就像激光灯一样的动画,如何实现呢?先看效果吧!
激光镭射灯效果动画
代码欣赏
代码及简单解释看下图:总体来说,代码量很小,难度一般,但是人家的思路是很独特的,需要仔细体会。
激光镭射效果Python完整代码
代码释义
那个函数draw_line()一点都不难理解:就是实现了一个从某个点(x1,y1)到另外一个点(x2,y2)画一条直线的功能。但是在双层嵌套的for循环里调用它是什么效果呢?这里教大家理解代码的一个方法:当你不知道某段代码的意思的时候,你把不明白的单独提出来,写一些简单的测试代码来执行下,就知道什么意思了。比如我们要弄明白双层for循环下draw_line()函数到底做了什么,我们把无关的代码剔除掉,仅留以下部分(测试代码):
注释掉三行代码,再加上一句pen.speed(0)以加速画画过程,我们就知道了上面的代码的运行结果是这样的:
测试代码执行的慢动作(图1)
测试代码的执行过程(图2)
测试代码的最终执行结果(图3)
从“慢动作”来看,双层for循环下draw_line()函数只不过是做了一些“画线”的动作:线的一点固定在(0,0)位置,线的另一个点呢?是从下到上、从左到右依次扫描,最终整体上看是画了一个黑黑的正方形(图3所示)。
激光灯扫描
那怎么实现“激光扫描”一样的效果呢?要干两件事:
1. 画画之前要写上:wn.tracer(False)。
2.双层for循环的draw_line()函数之后写上wn.update()这个函数。
wn.update()函数实现:“update()实现乌龟屏幕的更新,当tracer关闭的时候用;用于快速展示画画过程的内容”。好了,意思就是快速的画画,而且还让你看到过程。
将我们最上面的完整代码注释掉最后两行然后再执行看下效果,是不是这个样子的?
五颜六色出来了,是因为这句
从颜色列表里每次随机选择一种颜色,执行的最终结果变成了一个绚烂的矩形,看下面(当然,由于while循环一直进行,所以不断的从左到右画线扫描):
五颜六色出来了,说好的“激光”呢?秘密就在代码的最后两句:
if y1 % 20 == 0:
pen.clear()
上面一个if选择结构:“求余运算%”表达式的意思:当y1是20的倍数的时候,也就是每隔20个线,清除一下clear前面画的图,这样最终的结果就变成“激光镭射灯”射出光线的效果了!
你还可以将20换成别的数试试,比如:5,40,100,这些数试试,看看还会变成什么效果呢?是不是很好玩?
领取专属 10元无门槛券
私享最新 技术干货