在上一篇
中,我介绍了Python操作SQLite数据库,以实现对用户信息的读写。 到目前为止,我的天气预报就剩下“发送”按钮的功能、以及定时发送功能没有实现。 在这一篇中,我们完成这两个功能,给本系列文章划上一个句号。本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
首先来说说“发送”按钮的功能。点击“发送”按钮就是要给当前所有用户发送指定 的天气预报邮件。发送邮件的功能之前已经实现了,只不过当时只是所有用户发送相同的邮件, 只需要稍做修改即可。直接上代码。
self.Bind(wx.EVT_BUTTON, self.OnSend, self.sendBtn)
def sendToUsers(self):
users = self.searcher.getUserInfo() # 从数据库中获取用户信息
for (mail, city, note) in users: # 获取每个用户的邮箱、城市、备注信息
weather = WeatherInfo('http://wap.weather.com.cn/wap/weather/%s.shtml' %
city).getWeather() # 获取用户设定城市的天气信息
mailContent = []
for w in weather[2:4]: # 获取天气信息的具体内容
mailContent.append("〖" + w[0] + "〗" + w[1]) # 天气信息的内容
mailContent = ";\r\n".join(mailContent) # 将天气信息加入邮件正文
self.sendToUser(mail, weather[0], mailContent) # 发送天气邮件
self.stBar.SetStatusText(u'全部邮件发送完成!', 1) # 全部天气发送完成状态栏给出提示
现在“发送”按钮的功能也实现了,最后还剩下定时功能。定时功能也很简单,用到了wx.Timer。wx.Timer可以让你的 应用程序产生基于时间段的事件,对wx.Timer最灵活和最有效的用法是使它产生EVT_TIMER,并将该事件如同其 它事件一样进行绑定。使用wx.Timer可以分为三步:
- 创建定时器;
- 绑定定时器;
- 启动和停止定时器。
下面一步步详细解释一下。wx.Timer的构造函数为
wx.Timer(owner=None, id=-1)
本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
其中参数owner是实现wx.EvtHandler的实例,即任一能够接受事件通知的wxPython控件或其它的东西。 参数id用于区分不同的定时器。如果没有指定id,则wxPython会为你生成一个id号。如果当你创建定时器时, 你不想设置参数owner和 id,那么你可以以后随时使用SetOwner(owner=None, id=-1)方法来设置, 它设置同样的两个参数。
在你创建了定时器之后,你可以如下面一行的代码来在你的事件处理控件中绑定wx.EVT_TIMER事件
self.Bind(wx.EVT_TIMER, self.OnTimerEvent)
如果你需要绑定多个定时器到多个处理函数,你可以给Bind函数传递每个定时器的ID,或将定时器对象 作为源参数来传递。
timer1 = wx.Timer(self)
timer2 = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer1Event, timer1)
self.Bind(wx.EVT_TIMER, self.OnTimer2Event, timer2)
本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
在定时器事件被绑定后,你所需要做的所有事情就是启动该定时器,使用方法 Start(milliseconds=-1, oneShot=False)。其中参数milliseconds是毫秒数。 这将在经过milliseconds时间后,产生一个wx.EVT_TIMER事件。如果 milliseconds=-1,那么将使用早先的毫秒数。如果oneShot为 True,那么定时 器只产生wx.EVT_TIMER事件一次,然后定时器停止。否则,你必须显式地使用 Stop()方法来停止定时器。
本程序创建了一个定时器实例,一方面显示状态栏上的时间,另一方面,处理定时发送功能。
self.timer = wx.Timer(self) # 创建定时器
self.Bind(wx.EVT_TIMER, self.OnTime, self.timer) # 绑定计时器对象
self.timer.Start(500) # 启动定时器
def OnTime(self, event):
t = time.localtime(time.time()) # 获取本地时间
st = time.strftime("%H:%M:%S", t) # 将时间对象转换成HH:MM:SS格式(24小时)字符串
self.stBar.SetStatusText(st, 1) # 将时间字符串显示在状态栏上
if(self.isTimerOn): # 如果定时发送复选框
timer = self.timer_hour + ':' + self.timer_minute + ':' + self.timer_second # 获取定时时间
if(not cmp(st, timer)): # 当前时间等于定时时间时
time.sleep(1) # 因为定时器每500毫秒刷新一次,所以延时1秒钟,防止连续发送两次
self.sendToUsers() # 给用户发送天气预报
本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。
至此,我的天气预报的功能已经都实现了。为了实现给手机发送天气预报短信,还需要一台能够7x24小时连续运行的电脑,把我的程序挂在上面。 同时开通139邮箱,设置长短信提醒。这样每天就能够收到免费的天气预报短信了。
当然,并不是每个人都能找到一台能够7x24小时连续运行的电脑的,难道为了一个免费的天气预报就去租一台服务器?这也太不划算了。怎么办, 难道忙了这么久写的程序只能玩玩,没一点用处?非也非也!现在云计算正在盛行,只需要找“一朵”支持Python的、免费的云即可。这样的云有吗?答案是肯定的。 在此隆重推荐Google App Engine。虽然它不是完全免费的,但是每天都有免费的1G流量,发个天气预报,足矣!Google App Engine版本的天气预报我其实 已经实现了,目前已经每天帮家人和几个朋友提供免费的短信天气。以后找机会放出来和大家交流交流。
打造自己的天气预报系列文章到此算是完结了,欢迎广大朋友们留言讨论,并欢迎大家继续关注我的博客,关注三思之旅!本程序完整源代码稍后整理之后会放出,敬请期待。
本文出自三思之旅博客http://think3t.iteye.com,转载请注明出处。