`

打造自己的天气预报之(七)——实现实时发送

阅读更多

在上一篇

打造自己的天气预报之(六)——对数据库的操作

中,我介绍了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可以分为三步:

  1. 创建定时器;
  2. 绑定定时器;
  3. 启动和停止定时器。

下面一步步详细解释一下。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,转载请注明出处。

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics