2

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 でダウンロード タスクの進行状況を表示したいと思います。

どうすればそれを達成できますか?

4

2 に答える 2

2

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"})
于 2013-12-09T17:34:37.617 に答える
0

適切に文書化されていませんが、fetch_version_iterジェネレーター関数があります。

fetch_version_iter: fetch_version と同様ですが、実行中に進行状況を更新します

次の値が得られます。

yield {"ステータス": "ダウンロード中", "サイズ": infile_size, "受信": partfile.tell(), }

yield {"ステータス":"再試行中","サイズ":なし}

yield {"ステータス":"準備完了","パス":名前}

また、次のようなファイル名を取得できます。

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

于 2013-09-05T09:48:41.593 に答える