wxPython は、独自の SoftwareUpdate メソッドで Esky をラップしています。
https://github.com/wxWidgets/wxPython/blob/master/wx/lib/softwareupdate.py
それらの実装では、アプリケーションは新しいバージョンをチェックし、更新するかどうかをユーザーに尋ねます (対話には wx GUI を使用します)。ユーザーが更新を選択した場合、コードは単に esky の auto_update() メソッドを呼び出して残りを処理しますが、進行状況バーを更新し、Esky の進行状況を示すメッセージを提供する _updateProgress メソッドを提供します。
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 ソースファイル: init .pyの行: 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"})