当前课程知识点:Python 交互式程序设计导论 > 第3周 > B 课程视频(计时器) > 计时器
返回《Python 交互式程序设计导论》慕课在线视频课程列表
各位同学大家好,欢迎回到python交互式程序设计课程中
今天我们主要讲的内容是关于计时器
其实计时器在前面的课程当中大家已经接触过
在很多的游戏开发中,计时器是个非常重要的组件
下面我们开始今天的内容
在讲python中计时器的使用之前,我们先来看一个例子
这张图片相信很多同学都非常熟悉
可能大部分同学都玩过这样一款游戏植物大战僵尸
在这个游戏中大家思考一个问题
哪些游戏元素可能是由计时器周期性控制
比如说:我们从界面上方随机产生的阳光和界面右侧进入这个界面的僵尸
这些游戏元素都有可能是有Timer来控制的,是它周期性的执行
在python中创建一个计时器是非常容易的一件事情
大家看这句话就创建了一个每隔500毫秒执行的计时器
其中Timer是计时器的名称,当然我们可以起其它名字
括号里面有2个参数,第一个参数500指的是时间间隔,单位是毫秒
也就是0.5秒
第二个参数timer_handler指的是计时器的处理函数
这句话的意思实际上是启动计时器后每隔500毫秒调用一次timer_handler这个函数
时间间隔是500毫秒
对于Python计时器而言,它常用的方法主要是两个:
一个是start启动计时器,一个是stop停止计时器
同学们主要熟练掌握这两种方法,对计时器而言基本就够用了
那么第三个还需要知道一个检测计时器运行状态
它返回的是一个布尔类型的值
比如说timer.is_running(),意思是这个timer正在运行吗?
如果正在进行已经被启动了,那它返回的值是true,否则返回的是false
最后我这列出一个程序的例子,这个例子很简单
在Python的这个开发环境中,创建一个simpleguitk的一个窗口
然后在窗口上显示'欢迎进入python世界',并且每隔1秒钟在闪烁
我们来看一下这段代码,第一句话是导入simpleguitk开发包
在这我就不多说了,'displayed=true'这是一个全局变量
timer_handler定义了一个计时器的处理函数
draw函数是绘制界面,frame这句话是创建了一个窗口
set_draw_handler是注册draw这个函数
timer这句话大家应该很熟悉,它创建了一个每隔一秒中执行timer_handler这样的一个计时器
最后启动计时器,启动frame这个框架,这个程序我只是在这简单介绍下
下面我们在Pycharm这个环境当中给大家详细的演示和讲解
我们在Pycharm中对课件上的程序进行详细的讲解
首先我们浏览一下这个程序的主要框架和结构
第一部分,导入simpleguitk,这样一个导入语句在这就不多说了
下面来看一下,第一部分定义全局变量,第二部分定义事件处理的函数
一共有三个,分别是timer_handler主要是计时器的处理函数,start控制计时器的启动,stop函数控制计时器的停止,这个是由按钮来控制
下面还有draw函数,这个draw函数是屏幕绘制
这个同学们在前面的程序的编写过程中已经用过这个函数了,那么再往下呢
是创建一个窗口'frame=simplegui.creat_frame', 窗口的大小和窗口的标题
在往下面是创建按钮组件,创建计时器组件这句话我们很熟悉了,并且注册下面的函数
最后一部分就是启动程序,启动计时器
好,下面我们来具体讲解一下
首先来看一下,这三个函数实际上是我们程序最重要的部分
那么这个函数是计时器的处理函数,也就是说每隔一段固定的时间间隔,它就会被执行和调用
那么start函数和stop函数是由两个按钮分别触发的,也就是说当人点击了这个按钮会调用相应的函数
那么draw是一个屏幕绘制函数,是每隔一定的时间它会执行一次
但是这个执行是由一个叫displayed的全局变量进行控制,当或者如果displayed这个值取true真的时候
这个'canwas.draw_text'才会在屏幕上绘制这样一个字符串,如果displayed取值False的时候,屏幕上不会显示
所以大家看到的这个文字好像在闪烁一样,再往下看,这句话是创建了一个窗口
创建了一个多大的窗口呢,350*100的窗口,标题叫文本闪烁
在这个窗口上有三个组件,第一个组件是btn_start是指启动这个计时器组件
那么btn_stop是一个按钮是用来停止这个计时器,这句话是在frame上注册一个绘制屏幕的函数叫draw,set_draw_handler
timer创建一个计时器'=simlegui.creat_timer()',每隔一秒钟来调用一次timer_handler
大家注意看timer_handler、start、stop,这三种函数就是刚才我前面给大家讲解的这三个函数
那么这个drew函数是在哪调用的呢?
是在'frame.set_draw_handler(draw)'这个里面注册的
它表示这个窗口由draw函数,按照一定的频率进行刷新和绘制
最后我们启动这个timer,启动这个frame
在这我还想强调一点的就是关于displayed显示,我们来看一下,displayed是一个全局变量
首先呢,我把它设为true,就是真值
那么每隔一秒钟我要让displayed的值取反一次,取反以后
会使得这个draw函数根据displayed值决定是否绘制这样一个字符串
怎么取反呢,大家看一下这里,displayed是一个全局变量,我要想修改displayed的值
首先在函数体内部用global这个关键字来对displayed进行描述和修饰
这个时候timer_handler就知道了displayed是调用了外面的全局变量,而不是一个局部变量
怎么取反呢,大家请看第二句话,'displayed = not displayed',
那么displayed的初值我设置的True,每隔一秒钟这个函数被执行一次,它就会取反,not是取反
你原先是True,一not它就变成False,原来是False一not就变成True
所以每隔一秒钟,displayed就会从True变成False,或者从False变成True
那么这个时候,我们的draw函数,大家看一下,那么我们就可以判断当displayed为True的时候,我就用'canvas.draw_text'来绘制
如果display是False的时候,我就不绘制
所以运行效果是这样的,我们来运行下
我们来看一下,它在每隔一秒钟闪烁一次,每隔一秒钟闪烁一次
那么这有两个按钮,我点击停止闪烁,它调用的是stop
它把timer_stop也就是计时器被停止,所以它就不再闪烁了
那我开始闪烁,实际只要把timer置为start
调用start方法置为一个开始的状态,它就可以闪烁了
这个程序呢我就暂时先讲到这里,下面我再给大家来分析一个程序
首先我们来看下这个程序,它是一个怎么样的运行效果,我们来看一下
大家请看一下,这个程序大家看首先是一个字符串
然后每隔一个固定的时间会在屏幕上的随机位置重新绘制一遍
并且在这屏幕的左侧有个message的编辑框
我们可以再里面修改里面的文字,比如说我们修改为'Hello,World!',回车
这个时候屏幕上的文字就会显示为'Hello,World!'
这个程序怎么实现的,我们来看一下
首先我们还是来看下整个程序的结构和框架
第一部分仍然是全局变量的一个定义包括常量的定义
第二部分是关于事件处理函数的一部分内容,一部分函数tick
第三部分是draw函数,这个draw函数还是屏幕绘制,按照一定的频率进行绘制
在这只需要把message里面的文本,在position这个位置上显示出就可以了
然后下面是创建一个窗口,按照固定的宽和高,窗口的标题叫Home
下面一部分是注册事件处理函数,在这里面大家看有一个控件text,就是输入文本的编辑框
那么它的事件处理函数是update,下面是注册draw函数,绘制窗口的函数
再往下是个计时器,创建一个计时器,这个计时器两个参数,一个是interval,这个是个时间间隔
这个在我们前面们的定义全局变量的地方有它的定义,'interval = 1000 '毫秒,就是等于1秒
tick每隔interval这个时间间隔要执行的函数,在前面的这个位置有所定义,在这
这个函数其实就是产生一个随机的位置,产生一个随机的position并把这个position赋给draw函数让它在随机的位置绘制文本
我们来看一下,具体这个程序的运行应该是这样的一个流程
首先我们创建了窗口,注册相应的事件处理函数
那么timer被启动以后每隔interval就会执行tick函数
那么我们看每隔一秒钟inteval取1000,所以是一秒钟
我们执行了tick函数,tick在干什么呢,我们看看
tick里面定义了两个变量:一个是x,一个是y
实际上这就是坐标的横坐标和纵坐标两个分量
那么用'random.randrange',这个函数,随机函数来生成一个值,这个值是(0,width)
width指的是窗口的宽度,在这个区间内生成一个随机的值赋给x,当然是一个随机整数
那么同理在(0,height)之间生成一个随机整数给y,那么由x,y分别赋给position[0]和position[1]这个分量,那么这个时候position存放的一个随机位置的信息
也就说每隔一秒钟产生一个随机位置
然后这个随机位置会被draw函数里面的draw_text函数里面的position所调用
那么这个时候就会在随机的位置上绘制message这个信息
那么大小是36,颜色是红色
那么message的值是怎么得到的呢?大家看一下text,text是一个编辑框
它的注册的事件处理函数式update,现在我们看下update
message我在这里定义了一个全局变量,它的初始值是"Python is Fun!"
那么这个时候我们在update里面会写这样两行代码,这个很好理解
这个text是个编辑框,它的事件处理函数实际上会接受它编辑框里输入的文本
而text就是这个文本的内容
我们要对message进行修改,所以要在函数体内部用global这个关键字对message进行修饰
告诉update函数我这的message不是一个局局部变量而是全局变量
那么把text赋给message这个全局变量,就是修改message的值
所以当我们输入"Hello World!"以后敲回车,这个时候"Hello World!"就赋给了message
而draw函数在绘制的时候,就会把"Hello World!"绘制在随机产生的位置上
好了,这就是两个主要的程序
关注的焦点是计时器的使用
今天的课程就讲到这里
-课程简介
--课程简介
-A 课程视频(算数操作符及表达式)
--绪论
-B 课程视频(变量及赋值)
--变量
--项目提交
-C 辅助视频(计算机结构、Python开发环境安装)
-D 辅助视频(如何提交项目)
--项目提交
-第0周--小测验
-本周项目:"我喜欢Python"
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
--项目提交
-A 课程视频(函数)
--函数
--其它操作符
--随机函数
-B 课程视频(逻辑及表达式)
--逻辑值和比较
--条件
--编程技巧
-第1周--小测验
-本周项目:“老虎杠子鸡虫”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(Python交互式应用)
--事件驱动编程
--按钮
-B 课程视频(输入框、全局变量)
--输入框
--编程技巧
-第2周--小测验A
-第2周--小测验B
-本周项目:猫咪藏在哪个房间
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(画布绘图)
--画布和图形绘制
--字符串处理
--图片和音效
-B 课程视频(计时器)
--计时器
--交互式绘图
--“神奇时钟”游戏
--编程技巧
-第3周--小测验A
-第3周--小测验B
-本周项目:“神奇时钟”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(列表)
--列表
--键盘输入
--碰撞和反射
-B 课程视频(键盘控制)
--速度控制
--运动
--编程技巧
--“桌上冰球”游戏
-第4周--小测验A
-第4周--小测验B
-本周项目:“桌上冰球”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(鼠标输入、列表进阶)
--鼠标输入
--Video
--Video
--Video
-B 课程视频(字典和图片)
--Video
--Video
--Video
--Video
-第5周--小测验A
-第5周--小测验B
-本周项目:“世界杯八强连连看”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类)
--华容道中的类
-B 课程视频(平铺图片)
--平铺图片
--理解对象
--编程技巧
--“华容道”游戏
-第6周--小测验A
-第6周--小测验B
-本周项目:“华容道”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类进阶及文件操作)
--集合
--文件操作
--文字块类
--处理停止的文字块
-B 课程视频(游戏状态控制)
--游戏记分规则
--编程技巧
-第7周--小测验A
-第7周--小测验B
-本周项目:决战三字经
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板
-A、课程视屏(精灵集合)
--Video
--精灵类
--战士类
--编程技巧
-B、课程视屏(动画)
--精灵碰撞
--精灵动画
--编程技巧
--保卫家园游戏
-第8周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板