iTip的基本功能终于开发完成了!纪念一下~~~~
提醒功能的开发让我足足停滞了一天。首先对于iTip的提醒,肯定要用到wx.Timer控件,而且要不只用到一个,那如何动态创建多个变量呢?VB里面有个变量数组的概念,那Python下如何实现?逛了一下ChinaUinx的论坛,找到了一个帖子,里面的技巧帮我解决了这个问题,那就是建立字典,看下面这个演示:
self.timer={}
for i in something:
self.timer[i]=wx.Timer(self)
这样一来,就方便的动态初始化了变量,在代码中也能很方便的使用self.timer[i]对变量进行调用了。
这个问题解决了,下面就是提醒功能的具体实现了。我的设想是这样的,将wx.Timer和提醒处理函数alarm绑定,然后传递给alarm一个iTip消息实例用来在alarm函数中处理显示,代码如下:
def iTipAlarmSet(self,iTip):
self.timer[iTip.id]=wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.iTipAlarmShow(iTipinfo=iTip),self.timer[iTip.id])
... ...
其中iTipAlarmShow函数代码如下:
def iTipAlarmShow(self,event,iTipinfo):
iTipAlarm = AlarmFrame(self, -1,"",)
iTipAlarm.content.SetValue(iTip.content)
iTipAlarm.createtime.SetLabel(iTip.createdate.strftime('%Y-%m-%d %H:%M:%S'))
iTipAlarm.Show()
iTipWork().save(iTip, iTip.content)
看着这个代码,好像逻辑上是可行的哦~~(我是这么认为的囧)结果崩溃,我发现我没法向alarm函数中传递iTipinfo这个变量!换句话说就是iTipAlarmShow这个函数最多就’self’,’event’这两个参数了。我搜遍互联网就没找到能在事件Handler中添加额外变量的代码…囧
wxPython中可以自定义事件,我大概看了一下,实在是…有点复杂,而且好像也不能解决我的问题。只能换思路进行设计了。
最终解决的方法是,为所有需要提醒的iTip消息建立一个list,然后按照提醒时间从小到大排列。创建的多个wx.Timer的触发顺序是按照剩余时间来的,和list是一一对应的,也就是在alarm函数中按顺序显示list中的内容就行了。哎~实在是个比较笨的方法囧
==================================
PS:通过后来的深入学习才知道,对于以上这个问题有更好的解决方案,那就是自定义提醒函数,继承wx.Timer。并覆写Notify(self)方法即可!
class AlarmTimer(wx.Timer):
def __init__(self, ...):
wx.Timer.__init__(self)
"""initialization"""
... ...
def Notify(self):
"""Your Logic code here"""
... ...
这样一来,可直接使用以下方法进行调用:
self.timer=AlarmTimer(something)
self.timer.Start(1000)
在定时器到时之后,将会执行Notify中的方法。
===================================
说到list的排序,我记录一下如何根据实例的属性进行排序,给出下面的演示代码:
setAlarm=[]
setAlarm.append(iTip)
setAlarm.sort(lambda x,y: cmp(x.alarm, y.alarm))
iTip是个自定义类,它有个datetime类型的属性叫alarm。上面的代码就根据这个alarm属性对iTip类进行了从小到大的排序。
————————————————————————————-
我想Python下的学习就可以告一个段落了,从这个小项目的开发过程中,我学习到了很多东西,虽然更多的只是皮毛。如果能有人从我的笔记中受益,那就是我额外的收获了。
发表回复