在上一篇
中,我介绍了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,转载请注明出处。
相关推荐
天气预报信息——易语言模块 天气预报信息——易语言模块
IOS应用源码——天气预报.zip
微信小程序——天气预报(截图+源码).zip 微信小程序——天气预报(截图+源码).zip 微信小程序——天气预报(截图+源码).zip 微信小程序——天气预报(截图+源码).zip 微信小程序——天气预报(截图+源码).zip ...
人工智能技术能否提高地面气温预报的精度——记AI Challenger 2018全球天气预报挑战赛.pdf
程序中用到的数据库,含有全国上千城市代码 博文链接:https://think3t.iteye.com/blog/1772830
该项目的系列介绍文章:https://blog.csdn.net/weixin_50964512/article/details/125710864
基于App Inventor积木式编程API调用的设计与实现——以天气预报APP为例.pdf
打造移动数字化安全护城河——安全工作空间+零信任网关.pdf 打造移动数字化安全护城河——安全工作空间+零信任网关.pdf 打造移动数字化安全护城河——安全工作空间+零信任网关.pdf 打造移动数字化安全护城河——安全...
├─05 实战Google Maps API之三——地图天气预报服务 │ ├─5.1 在Google地图上显示天气预报 │ │ ├─5.1.2 利用Google AJAX Feed API加载RSS文档 │ │ └─5.1.3 YWeather()类的构造 │ └─5.2 │ └─...
安卓Android源码——天气预报源码.zip
通过调用webservice显示全国天气预报
源代码及天气图标文件 博文链接:https://think3t.iteye.com/blog/1315253
打造海空 和平之盾——解读2010中国国防白皮书.pdf
Android源码——UI界面漂亮的天气预报源码.zip
IOS应用源码——天气预报.rar
安卓Android源码——天气预报.zip
Android源码——天气预报源码.zip
Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发系列源码——星级评价实现代码Iphone开发...
地面气象数据挖掘——针对短时临近天气预报应用.pdf