首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Esky任务获得进展

通过Esky任务获得进展
EN

Stack Overflow用户
提问于 2013-09-05 09:11:23
回答 2查看 266关注 0票数 2

我用的是Esky和我的冷冻应用程序。它具有以下属性和方法,可用于Esky类:

代码语言:javascript
复制
app.version:                the current best available version.

app.active_version:         the currently-executing version, or None
                            if the esky isn't for the current app.

app.find_update():          find the best available update, or None
                            if no updates are available.

app.fetch_version(v):       fetch the specified version into local storage.

app.install_version(v):     install and activate the specified version.

现在,这一切都很好,但我想在我的Gui中展示下载任务的进展。

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-05 09:48:41

没有正确地记录文档,就有fetch_version_iter生成器函数:

fetch_version_iter:与fetch_version相似,但在执行过程中生成进度更新

它产生以下值:

屈服{“状态”:“下载”,“大小”:infile_size,“接收”:partfile.tell(),} 屈服{“状态”:“重试”,“大小”:无} 产生{“状态”:“就绪”,“路径”:名称}

此外,您也可以像这样获得文件名:

( app.version_finder.version_graph.get_best_path(app.version,v)

票数 0
EN

Stack Overflow用户

发布于 2013-12-09 17:34:37

wxPython在他们自己的SoftwareUpdate方法中封装了Esky:

https://github.com/wxWidgets/wxPython/blob/master/wx/lib/softwareupdate.py

在它们的实现中,应用程序检查新版本,并询问用户是否想更新(使用wx进行交互)。如果用户选择更新,代码只需调用Esky的auto_update()方法来处理其余部分,但是他们提供了一个_updateProgress方法,该方法更新进度条并提供指示Esky进度的消息:

代码语言:javascript
复制
self._esky.auto_update(self._updateProgress)

..。

代码语言:javascript
复制
def _updateProgress(self, status):
    # Show progress of the download and install. This function is passed to Esky
    # functions to use as a callback.
    if self._pd is None and status.get('status') != 'done':
        self._pd = wx.ProgressDialog('Software Update', ' '*40, 
                                      style=wx.PD_CAN_ABORT|wx.PD_APP_MODAL,
                                      parent=self._parentWindow)
        self._pd.Update(0, '')

        if self._parentWindow:
            self._pd.CenterOnParent()

    simpleMsgMap = { 'searching'   : 'Searching...',
                     'retrying'    : 'Retrying...',
                     'ready'       : 'Download complete...',
                     'installing'  : 'Installing...',
                     'cleaning up' : 'Cleaning up...',}

    if status.get('status') in simpleMsgMap:
        self._doUpdateProgress(True, simpleMsgMap[status.get('status')])

    elif status.get('status') == 'found':
        self._doUpdateProgress(True, 'Found version %s...' % status.get('new_version'))

    elif status.get('status') == 'downloading':
        received = status.get('received')
        size = status.get('size')
        currentPercentage = 1.0 * received / size * 100
        if currentPercentage > 99.5:
            self._doUpdateProgress(False, "Unzipping...", int(currentPercentage))
        else:
            self._doUpdateProgress(False, "Downloading...", int(currentPercentage))

    elif status.get('status') == 'done': 
        if self._pd:
            self._pd.Destroy()
        self._pd = None

    wx.Yield()


def _doUpdateProgress(self, pulse, message, value=0):
    if pulse:
        keepGoing, skip = self._pd.Pulse(message)
    else:
        keepGoing, skip = self._pd.Update(value, message)
    if not keepGoing: # user pressed the cancel button
        self._pd.Destroy()
        self._pd = None
        raise UpdateAbortedError()

上面的代码直接取自https://github.com/wxWidgets/wxPython/blob/master/wx/lib/softwareupdate.py

Esky源代码,.py线路: 689中记录了这个特性。

代码本身显示了您的回调在整个更新过程中可以看到的内容。以下是调用回调的一些摘录:

代码语言:javascript
复制
callback({"status":"searching"})
callback({"status":"found", "new_version":version})
callback({"status":"installing", "new_version":version})
for status in self.sudo_proxy.fetch_version_iter(version):
    if callback is not None:
        callback(status)
callback({"status":"cleaning up"})
callback({"status":"cleaning up"})
callback({"status":"error","exception":e})
callback({"status":"done"})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18632261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档