gpt4 book ai didi

python - 通过 Esky 任务获取进度

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:43 26 4
gpt4 key购买 nike

我将 Esky 与我卡住的应用程序一起使用。它具有以下属性和方法在 Esky 类上可用:

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 中显示下载任务的进度。

我怎样才能做到这一点?

最佳答案

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

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

在他们的实现中,应用程序检查新版本,并询问用户是否愿意更新(使用 wx GUI 进行交互)。如果用户选择更新,代码会简单地调用 esky 的 auto_update() 方法来处理剩下的事情,但是他们为它提供了一个 _updateProgress 方法来更新进度条并提供指示 Esky 进度的消息:

self._esky.auto_update(self._updateProgress)

...

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 源中,file: init.py , line: 689 .

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

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"})

关于python - 通过 Esky 任务获取进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18632261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com