py2exe打包笔记

Filed under: Python, 技术相关 | 3 Comments »
Posted on

    iTip虽然已经打包成功,但是有两点遗憾,一是未能打包成单个exe文件,打包目录下零散文件太多;二是打包后窗体xp样式丢失@_@。今天,终于~~终于解决了!

    先记录一下我打包遇到的问题:

  1. ImportError: No module named sqlite
  2. LookupError: unknown encoding: ascii
  3. 如何打包成单个exe文件
  4. 打包后窗口xp样式丢失

    以上问题都在setup.py文件中解决!给出我的setup.py文件代码:

Read the rest of this entry »

Popularity: 22% [?]

iTip开发笔记六

Filed under: Python, 技术相关 | No Comments »
Posted on

      我在前面的笔记五里面曾经提到过无法向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

Filed under: Python, 技术相关 | No Comments »
Posted on

 

   iTip是个电子便笺,他的出现是我学习Python练手的产物。在这个过程中,我从Internet吸收了很多有用的知识和技巧,每当我在某个blog中找到所需要的信息时,我都会非常的感激。所以我也很希望有人能从我的blog中有所收获。

    已经成功打包,参见iTip打包记    py2exe打包笔记

 

 

===========11月20日改动部分代码============

取消gettext

更改iTip提醒代码

更改鼠标拖动代码,修正拖动错误

===========11月22日更新打包文件============

修正设置窗体List下的数据同步错误

===========11月25日重写iTip==============

 

iTip-Alpha版已经放出,请移步至这里

    

Popularity: 16% [?]

iTip开发笔记五

Filed under: Python, 技术相关 | No Comments »
Posted on

 

    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开发笔记四

Filed under: Python, 技术相关 | No Comments »
Posted on

        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开发笔记三

Filed under: Python, 技术相关 | No Comments »
Posted on

     基本完成了iTip主窗口界面的设计。主窗口的主要功能有:

 

  •  添加便笺
  •  浏览便笺
  •  删除便笺
  •  锁定窗体
  •  设置提醒

 

    这个看似简洁的界面其实隐藏了很多控件,比如左下角的闹钟,只有鼠标放上去的时候才会出现,而点击小闹钟才会出现设置时间的控件。大量使用控件的Hide()和Show()方法才能使得窗体简洁。在设计过程中,有一个问题让我花费了大量的时间。 Read the rest of this entry »

Popularity: 12% [?]

iTip开发笔记二

Filed under: Python, 技术相关 | No Comments »
Posted on

        这两天刚给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% [?]

wxPython下无标题栏窗体的移动

Filed under: Python, 技术相关 | No Comments »
Posted on

         由于没有找到类似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% [?]