就像很难找到一个简单的秒表应用程序一样,也很难找到一个简单的倒计时程
序。让我们来写一个倒计时程序,在倒计时结束时报警。总的来说,程序要做到:
• 从 60 倒数。
• 倒数至 0 时播放声音文件(alarm.wav)。这意味着代码将需要做到以下几点:
• 在显示倒计时的每个数字之间,调用 time.sleep()暂停一秒。
• 调用 subprocess.Popen(),用默认的应用程序播放声音文件。打开一个新的文件编辑器窗口,并保存为 countdown.py。
第 1 步:倒计时
这个程序需要 time 模块的time.sleep()函数,subprocess 模块的 subprocess. Popen()
函数。输入以下代码并保存为 countdown.py:
#! python3
# countdown.py - A simple countdown script. import time, subprocess
➊ timeLeft = 60
while timeLeft > 0:
➋ print(timeLeft, end='')
➌ time.sleep(1)
➍ timeLeft = timeLeft - 1
# TODO: At the end of the countdown, play a sound file.
导入 time 和 subprocess 后,创建变量 timeleft,保存倒计时剩下的秒数➊。它从 60 开始,或者可以根据需要更改这里的值,甚至通过命令行参数设置它。
在 while 循环中,显示剩余次数➋,暂停一秒钟➌,再减少 timeleft 变量的值➍,然后循环再次开始。只要
timeleft 大于 0,循环就继续。在这之后,倒计时就结束了。
第 2 步:播放声音文件
虽然有第三方模块,播放各种声音文件,但快速而简单的方法,是启动用户使
用的任何播放声音文件的应用程序。操作系统通过.wav 文件扩展名,会弄清楚应该启动哪个应用程序来播放该文件。这个.wav 文件很容易变成其他声音文件格式,如.mp3 或.ogg。
可以使用计算机上的任何声音文件,在倒计时结束播放,也可以从 http://nostarch. com/automatestuff/下载 alarm.wav。
在程序中添加以下代码:
#! python3
# countdown.py - A simple countdown script. import time, subprocess
--snip--
# At the end of the countdown, play a sound file. subprocess.Popen(['start',
'alarm.wav'], shell=True)
while 循环结束后,alarm.wav(或你选择的声音文件)将播放,通知用户倒计时结束。在 Windows 上,要确保传入 Popen()的列表中包含'start',并传入关键字参数
shell=True。在 OS X 上,传入'open',而不是'start’,并去掉 shell=True。
除了播放声音文件之外,你可以在一个文本文件中保存一条消息,例如 Break time is over!。然后在倒计时结束时用
Popen()打开它。这实际上创建了一个带消息的弹出窗口。或者你可以在倒计时结束时,用webbrowser.open()函数打开特定网站。不像在网上找到的一些免费倒计时应用程序,你自己的倒计时程序的警
报可以是任何你希望的方式!
第 3 步:类似程序的想法
倒计时是简单的延时,然后继续执行程序。这也可以用于其他应用程序和功能,诸如:
• 利用 time.sleep()给用户一个机会,按下 Ctrl-C 取消的操作,例如删除文件。你的程序可以打印“Press Ctrl-C to cancel”,然后用
try 和 except 语句处理所有 KeyboardInterrupt 异常。
• 对于长期的倒计时,可以用 timedelta 对象来测量直到未来某个时间点(生日?周年纪念?)的天、时、分和秒数。
小结
对于许多编程语言,包括 Python,Unix 纪元(1970 年 1 月 1 日午夜,UTC)
是一个标准的参考时间。虽然 time.time()函数模块返回一个 Unix 纪元时间戳(也就是自 Unix 纪元以来的秒数的浮点值),但 datetime 模块更适合执行日期计算、格
式化和解析日期信息的字符串。
time.sleep()函数将阻塞(即不返回)若干秒。它可以用于在程序中暂停。但如果想安排程序在特定时间启动,http://nostarch.com/automatestuff/上的指南可以告诉你如何
使用操作系统已经提供的调度程序。
threading 模块用于创建多个线程,如果需要下载多个文件或同时执行其他任务,这非常有用。但是要确保线程只读写局部变量,否则可能会遇到并发问题。
最后,Python 程序可以用 subprocess.Popen()函数,启动其他应用程序。命令行参数可以传递给 Popen()调用,用该应用程序打开特定的文档。另外,也可以用 Popen()启动
start、open 或 see 程序,利用计算机的文件关联,自动弄清楚用来打开文件的应用程序。通过利用计算机上的其他应用程序,Python 程序可以利用它们的能力,满足你的自动化需求。