虫子满屏爬_三bug多线程示例程序浅析

虫子满屏爬_三bug多线程示例程序浅析_第1张图片

李兴球Python三bug多线程示例程序演示动图


想像一下许多虫子在屏幕上爬来爬去的情景吧。用Python实现是完全可以的,我们可以用turtle模块,即海龟画图模块来实现。让海龟的造型为一张图片,不过遗憾地是由于海龟画图不支持图像旋转,所以用这个模块实现就比较难了。当然,你是高手的话可以加入numpy或pillow模块,自己编程去实现。这里用一种简单的方法来实现。它已经帮我们实现好了,我们只要简单地调用即可。这个模块叫Python精灵模块,英文名为sprites。你可以认为sprites模块是turtle模块的凤凰涅磐。它是turtle模块的重大升级版。所以当你用from sprites import *语句导入了所有命令,不要再用from turtle import *命令了。因为后者会覆盖前者的同名命令。
虫子满屏爬_三bug多线程示例程序浅析_第2张图片

 

那么如何安装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个单位

虫子满屏爬_三bug多线程示例程序浅析_第3张图片

李兴球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命令是一样的,都是定位角色坐标的。

虫子满屏爬_三bug多线程示例程序浅析_第4张图片

李兴球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

你可能感兴趣的:(turtle,python知识)