iTip虽然已经打包成功,但是有两点遗憾,一是未能打包成单个exe文件,打包目录下零散文件太多;二是打包后窗体xp样式丢失@_@。今天,终于~~终于解决了!
先记录一下我打包遇到的问题:
- ImportError: No module named sqlite
- LookupError: unknown encoding: ascii
- 如何打包成单个exe文件
- 打包后窗口xp样式丢失
以上问题都在setup.py文件中解决!给出我的setup.py文件代码:
Popularity: 22% [?]
我在前面的笔记五里面曾经提到过无法向Handler中传递参数的问题,今天和limoudou交流了一下,受益匪浅,成功的解决了这个问题。记录一下:
def fuc(self,somthing): def eventhandler(event): #process print somthing ...... return eventhandler
采用函数嵌套函数的办法就能成功解决这个问题,看看将事件绑定的用法:
self.timer=wx.Timer(self) self.Bind(wx.EVT_TIMER,self.fuc('Hello'),self.timer) self.timer.Start(1000,oneShot=True)
如此一来,就能够将所需参数传递给事件处理函数了!这样我就可以在iTip中为每个提醒事件创立一个Timer,然后将iTip实例作为参数传递给显示函数了…
源代码先不改了,实在是没有力气了,刚刚又为打包折腾了一个上午,没有成功。运用py2exe进行打包的时候,提示错误很明显,说找不到sqlite模块。我在打包目录下的Library.zip里面自行添加了sqlite模块,结果又提示缺少另外一个模块,我再添加,又提示少另外一个,我的天啊~~~~~放弃!!!我实在就搞不明白了,我在命令行下用Python iTip.py能够成功运行程序,为什么,为什么,打包就这么难!!!!!用了3个打包程序都这么笨,就是找不到模块!
Popularity: 16% [?]
iTip是个电子便笺,他的出现是我学习Python练手的产物。在这个过程中,我从Internet吸收了很多有用的知识和技巧,每当我在某个blog中找到所需要的信息时,我都会非常的感激。所以我也很希望有人能从我的blog中有所收获。
已经成功打包,参见iTip打包记 py2exe打包笔记
===========11月20日改动部分代码============
取消gettext
更改iTip提醒代码
更改鼠标拖动代码,修正拖动错误
===========11月22日更新打包文件============
修正设置窗体List下的数据同步错误
===========11月25日重写iTip==============
Popularity: 16% [?]
iTip的基本功能终于开发完成了!纪念一下~~~~
提醒功能的开发让我足足停滞了一天。首先对于iTip的提醒,肯定要用到wx.Timer控件,而且要不只用到一个,那如何动态创建多个变量呢?VB里面有个变量数组的概念,那Python下如何实现?逛了一下ChinaUinx的论坛,找到了一个帖子,里面的技巧帮我解决了这个问题,那就是建立字典,看下面这个演示:
self.timer={} for i in something: self.timer[i]=wx.Timer(self)
这样一来,就方便的动态初始化了变量,在代码中也能很方便的使用self.timer[i]对变量进行调用了。
Read the rest of this entry »
Popularity: 15% [?]
iTip后台界面设计和部分功能开发完毕,目前正在设计iTip的提醒功能。后台界面的窗口样式选择了wx.CAPTION|wx.NO_BORDER|wx.SYSTEM_MENU|wx.CLOSE_BOX这样的组合,其中wx.No_BORDER是限制了窗口大小无法手动改变,wx.CAPTION和wx.CLOSE_BOX是指在标题栏加上“显示标题”和“显示关闭框”,这两个功能只有在启用了wx.SYSTEM_MENU样式之后才会生效。
关于wxPyhon下,右键popupMenu的使用方法,这里有一个可复用的代码:
def OnRightClick(self, event): # only do this part the first time so the events are only bound once if not hasattr(self, "popupID1"): self.popupID1 = wx.NewId() self.popupID2 = wx.NewId() self.popupID3 = wx.NewId() self.Bind(wx.EVT_MENU, self.OniTipDelete, id=self.popupID1) self.Bind(wx.EVT_MENU, self.OniTipSearch, id=self.popupID2) self.Bind(wx.EVT_MENU, self.OniTipDeleteAll, id=self.popupID3) menu = wx.Menu() menu.Append(self.popupID1, u"删除") menu.Append(self.popupID2, u"查找") menu.Append(self.popupID3, u"删除全部") self.list.PopupMenu(menu, event.GetPosition()) menu.Destroy()
使用过程中只需要将触发事件和函数Bind即可。如:
self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnRightClick, self.list)
Popularity: 13% [?]
基本完成了iTip主窗口界面的设计。主窗口的主要功能有:
- 添加便笺
- 浏览便笺
- 删除便笺
- 锁定窗体
- 设置提醒
这个看似简洁的界面其实隐藏了很多控件,比如左下角的闹钟,只有鼠标放上去的时候才会出现,而点击小闹钟才会出现设置时间的控件。大量使用控件的Hide()和Show()方法才能使得窗体简洁。在设计过程中,有一个问题让我花费了大量的时间。 Read the rest of this entry »
Popularity: 12% [?]
这两天刚给blog搬了家,在域名解析和数据导入上费了大工夫了。同时对Python的学习也异常缓慢囧
iTip的消息有个重要的属性是“时间”,不光要记录日期还要精确到秒。那如何在SQLite中保存时间类型的数据,以及如何在python中使用呢?
iTip的时间是这样一种格式“2008-11-09 18:23:21”,在SQLAlchemy中创建表数据的使用“DateTime”类型,它对应的SQLite中的数据类型为TIMESTAMP。这里要注意的是,SQLite相对于Python,能够接受的数据类型只有一种,那就是datetime。你不能直接将“时间字符串”往SQLite里面送,虽然SQLite里面对于TIMESTAMP的保存实际就是字符串形式。SQLite会自动进行转换。同理,那从数据库中返回的也是datetime类型的数据了。理解了这个就好办了。
来看看datetime下的两个方法。
import datetime now=datetime.datetime.now()
now输出的话看起来是这样的:2008-11-09 16:40:31.784000
这正是我要保存在数据库中的: 年 -月-日 时:分:秒:毫秒
其中毫秒的信息是不需要的,怎么利用这个时间类型做事情呢,看一看这个方法
Y,M,D,h,m,s,dw,dy,dl=now.timetuple()
timetuple()方法返回一个tuple,包含了time类型中的时间结构。
print "[%s]-[%s]-[%s]-[%s]-[%s]-[%s]-[%s]-[%s]-[%s]"%(Y,M,D,h,m,s,dw,dy,dl)
对应上面的now的输出结果看起来是这样的
[2008]-[11]-[9]-[16]-[40]-[31]-[6]-[314]-[-1]
年 月 日 时 分 秒
后面的”6″表示11月9日是星期日(0代表星期一)
在后面的”314″表示11月9日在是2008年里面的第314天
最后一个数字的含义是有关”if daylight saving time is effect”
“1″表示有效,”0″表示无效,”-1″表示无相关信息。没多大用,基本可以忽略(个人愚见)
呵呵,这样一来就可以利用时间信息做很多事情咯~~
Read the rest of this entry »
Popularity: 12% [?]
由于没有找到类似vb那样,可以直接调用系统函数的方法来实现无标题栏窗体的移动,所以只有采取“土法”移动了。即根据拖动过程中计算鼠标移动位置的差然后相应Move窗体囧rz,记录一下其代码的具体实现,其中panel是覆盖在窗体中的一块面板控件…
... ...
#将鼠标左键按下事件与窗体面板控件绑定
self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnPanelLeftDown)
#将鼠标移动事件与窗体面板控件绑定
self.panel.Bind(wx.EVT_MOTION, self.OnPanelMotion)
#将鼠标左键放开事件与窗体面板控件绑定
self.panel.Bind(wx.EVT_LEFT_UP, self.OnPanelLeftUp)
... ...
def OnPanelLeftDown(self, event):
#锁定鼠标,禁止其他鼠标响应事件
self.panel.CaptureMouse()
#获取鼠标初始位置
mouse=wx.GetMousePosition()
#获取窗口初始位置
frame=self.GetPosition()
self.delta=wx.Point(mouse.x-frame.x,mouse.y-frame.y)
def OnPanelMotion(self, event):
#判断鼠标是否左键拖曳
if event.Dragging() and event.LeftIsDowm():
#获取鼠标新位置
mouse=wx.GetMousePosition()
#计算鼠标移动位置差值,Move窗体到相应位置
self.Move((mouse.x-self.delta.x,\
mouse.y-self.delta.y))
def OnPanelLeftUp(self, event):
#释放鼠标
if self.panel.HasCapture():
self.panel.ReleaseMouse()Popularity: 7% [?]






