李兴球Python三bug多线程示例程序演示动图
想像一下许多虫子在屏幕上爬来爬去的情景吧。用Python实现是完全可以的,我们可以用turtle模块,即海龟画图模块来实现。让海龟的造型为一张图片,不过遗憾地是由于海龟画图不支持图像旋转,所以用这个模块实现就比较难了。当然,你是高手的话可以加入numpy或pillow模块,自己编程去实现。这里用一种简单的方法来实现。它已经帮我们实现好了,我们只要简单地调用即可。这个模块叫Python精灵模块,英文名为sprites。你可以认为sprites模块是turtle模块的凤凰涅磐。它是turtle模块的重大升级版。所以当你用from sprites import *语句导入了所有命令,不要再用from turtle import *命令了。因为后者会覆盖前者的同名命令。
那么如何安装sprites模块呢?用pip install sprites命令即可。现实情况下由于要访问国外的服务器,所以安装速度在某些地方很慢以致于安装不上。所以我们要用cmd打开管理员窗口,用下面的命令进行安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade
上面是从清华大学服务器下载sprites模块,然后安装的,由于从国内服务器下载,所以速度非常快。安装好后,用from sprites import Sprite,Screen语句可以导入Sprite类和Screen函数。然后用Sprite()就能新建一只虫子,假设取名为bug,那么命令如下所示:
from sprite import Sprite,Screen bug = Sprite()
接下来就可以让bug不断地满屏爬了。简单化一下,来一个while循环。
while True 代码的控制结构。它可以让同组代码不断地重复执行。bug.fd(1)可以让bug前进一个单位,bug.right(1)可以让虫子右转,简写为bug.rt(1),代码变成了像下面这样:
from sprites import Sprite,Screen bug = Sprite() # 新建角色,名为bug while True: # 重复执行 bug.fd(1) # 虫子前进1个单位 bug.rt(1) # 虫子右转1个单位
李兴球Python一只虫子爬
上面的程序运行后,就能看到一只虫子爬了。如果要有更多的虫子爬,我们只要新建更多的角色即可。程序变成像下面这样了:
from sprites import Sprite,Screen bug1 = Sprite() # 新建虫子1 bug2 = Sprite() # 新建虫子2 bug2.goto(100,100) # bug2的坐标定位到(100,100) bug3 = Sprite() # 新建虫子3 bug3.goto(-100,100) # bug3的坐标定位到(-100,100) while True: # 当成立的时候(重复执行) bug1.fd(1) # 虫子1前进1个单位 bug1.rt(1) # 虫子1向右转1个单位 bug2.fd(1) # 虫子2前进1个单位 bug2.rt(1) # 虫子2向右转1个单位 bug3.fd(1) # 虫子3前进1个单位 bug3.lt(1) # 虫子3向左转1个单位
上面goto命令和海龟画图中的goto命令是一样的,都是定位角色坐标的。
李兴球Python多线程动画
上面的程序是单线程的,只有一个while循环。如果想有几个while循环同时执行的话就要使用多线程编程了。接下来我们导入Thread,用from threading import *即可。我们这里创建三个线程,每个线程的目标函数会创建一个虫子角色,然后通过while循环让名为bug的虫子不断地爬。这个函数就像下面这样:
def myt1():
bug = Sprite()
while True:
bug.fd(1)
bug.rt(1)
函数定义好了,我们就能用Thread命令来创建线程了,语句如下所示:
thread1 = Thread(target=myt1)
最后,我们只要简单地调用thread1的start方法就能启动这个线程了。
代码如下所示:
thread1.start()
那么创建三个线程,只要定义三个函数,启动三个线程就可以了。最后,多线程虫子爬的代码如下所示:
""" 三bug多线程示例程序.py 本程序创建了三个线程,每个线程都会创建一个bug。 bug定位后会不断地旋转。 本程序需要Python精灵模块支持,请用cmd命令,打开管理员窗口, 然后输入以下使命令进行安装: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites --upgrade """ from threading import * from sprites import Sprite,Screen def myt1(): bug = Sprite() while True: bug.fd(1) bug.rt(1) def myt2(): bug = Sprite() bug.goto(100,100) while True: bug.fd(1) bug.lt(1) def myt3(): bug = Sprite() bug.goto(-100,100) while True: bug.fd(1) bug.lt(1) screen = Screen() # 新建屏幕对象 thread1 = Thread(target=myt1) # 创建一个线程 thread2 = Thread(target=myt2) # 创建一个线程 thread3 = Thread(target=myt3) # 创建一个线程 thread1.start() # 启动线程1 thread2.start() # 启动线程2 thread3.start() # 启动线程3 screen.mainloop()
更高级的编程方法是可以创建一个Bug类。它继承自Sprite类。当Bug生成后会自动创建一个线程,自己爬。不过这已经超出本篇论述范围,高级读者可以尝试自行完成。
使用Python精灵模块能非常简单的创建动画与游戏,更多Python创意/示例源或作品与教程请打开李兴球博客 www.lixingqiu.com