您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 基于esky实现python应用的自动升级
基于esky实现python应用的自动升级一、esky介绍Eskyisanauto-updateframeworkforfrozenPythonapplications.ItprovidesasimpleAPIthroughwhichappscanfind,fetchandinstallupdates,andabootstrappingmechanismthatkeepstheappsafeinthefaceoffailedorpartialupdates.Updatescanalsobesentasdifferentialpatches.Eskyiscurrentlycapableoffreezingappswithpy2exe,py2app,cxfreezeandbbfreeze.Addingsupportforotherfreezerprogramsshouldbeeasy;patcheswillbegratefullyaccepted.WearetestedandrunningonPython2.7Py2appwillworkonpython3fine,theotherfreezersnotsomuch.Esky是一个python编译程序的自动升级框架,提供简单的api实现应用的自动更新(包括比较版本、更新版本),esky支持py2exe,py2app,cxfreeze以及bbfreeze等多种python打包框架。二、esky安装及说明1、pip安装pipinstallesky2、esky说明、esky教学视频三、esky用法示例esky用起来比较简单,我们这里以常用的基于wx的windows应用举例。wxpython下有个wx.lib.softwareupdate类,对wxpython应用的esky升级进行了二次封装。网上有个现成的示范例子,具体网址:代码很简单,对其中的关键部分进行注释说明(红色字体部分):复制代码#----------------------------------------#image_viewer2.py##Created03-20-2010##Author:MikeDriscoll#----------------------------------------importglobimportosimportwxfromwx.lib.pubsubimportsetuparg1fromwx.lib.pubsubimportpubasPublisher#申明语句fromwx.lib.softwareupdateimportSoftwareUpdateimportversion########################################################################classViewerPanel(wx.Panel):#----------------------------------------------------------------------def__init__(self,parent):Constructorwx.Panel.__init__(self,parent)width,height=wx.DisplaySize()self.picPaths=[]self.currentPicture=0self.totalPictures=0self.photoMaxSize=height-200Publisher.subscribe(self.updateImages,(updateimages))self.slideTimer=wx.Timer(None)self.slideTimer.Bind(wx.EVT_TIMER,self.update)self.layout()#----------------------------------------------------------------------deflayout(self):Layoutthewidgetsonthepanelself.mainSizer=wx.BoxSizer(wx.VERTICAL)btnSizer=wx.BoxSizer(wx.HORIZONTAL)img=wx.EmptyImage(self.photoMaxSize,self.photoMaxSize)self.imageCtrl=wx.StaticBitmap(self,wx.ID_ANY,wx.BitmapFromImage(img))self.mainSizer.Add(self.imageCtrl,0,wx.ALL|wx.CENTER,5)self.imageLabel=wx.StaticText(self,label=)self.mainSizer.Add(self.imageLabel,0,wx.ALL|wx.CENTER,5)btnData=[(Previous,btnSizer,self.onPrevious),(SlideShow,btnSizer,self.onSlideShow),(Next,btnSizer,self.onNext)]fordatainbtnData:label,sizer,handler=dataself.btnBuilder(label,sizer,handler)self.mainSizer.Add(btnSizer,0,wx.CENTER)self.SetSizer(self.mainSizer)#----------------------------------------------------------------------defbtnBuilder(self,label,sizer,handler):Buildsabutton,bindsittoaneventhandlerandaddsittoasizerbtn=wx.Button(self,label=label)btn.Bind(wx.EVT_BUTTON,handler)sizer.Add(btn,0,wx.ALL|wx.CENTER,5)#----------------------------------------------------------------------defloadImage(self,image):image_name=os.path.basename(image)img=wx.Image(image,wx.BITMAP_TYPE_ANY)#scaletheimage,preservingtheaspectratioW=img.GetWidth()H=img.GetHeight()ifWH:NewW=self.photoMaxSizeNewH=self.photoMaxSize*H/Welse:NewH=self.photoMaxSizeNewW=self.photoMaxSize*W/Himg=img.Scale(NewW,NewH)self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))self.imageLabel.SetLabel(image_name)self.Refresh()Publisher.sendMessage(resize,)#----------------------------------------------------------------------defnextPicture(self):Loadsthenextpictureinthedirectoryifself.currentPicture==self.totalPictures-1:self.currentPicture=0else:self.currentPicture+=1self.loadImage(self.picPaths[self.currentPicture])#----------------------------------------------------------------------defpreviousPicture(self):Displaysthepreviouspictureinthedirectoryifself.currentPicture==0:self.currentPicture=self.totalPictures-1else:self.currentPicture-=1self.loadImage(self.picPaths[self.currentPicture])#----------------------------------------------------------------------defupdate(self,event):CalledwhentheslideTimer'stimereventfires.LoadsthenextpicturefromthefolderbycallingthnextPicturemethodself.nextPicture()#----------------------------------------------------------------------defupdateImages(self,msg):UpdatesthepicPathslisttocontainthecurrentfolder'simagesself.picPaths=msg.dataself.totalPictures=len(self.picPaths)self.loadImage(self.picPaths[0])#----------------------------------------------------------------------defonNext(self,event):CallsthenextPicturemethodself.nextPicture()#----------------------------------------------------------------------defonPrevious(self,event):CallsthepreviousPicturemethodself.previousPicture()#----------------------------------------------------------------------defonSlideShow(self,event):Startsandstopstheslideshowbtn=event.GetEventObject()label=btn.GetLabel()iflabel==SlideShow:self.slideTimer.Start(3000)btn.SetLabel(Stop)else:self.slideTimer.Stop()btn.SetLabel(SlideShow)########################################################################classViewerFrame(wx.Frame):#--------------------
本文标题:基于esky实现python应用的自动升级
链接地址:https://www.777doc.com/doc-4239364 .html