0

wxpython アプリケーションにプログレス バーを含める必要がありますが、私が見つけた例では、一定時間の長さからカウントダウンするタイマーを使用しています。特定のコンピューターがプロセスを実行するのにどれくらいの時間がかかるかわからないため、特定の各ステップが完了するたびに進行状況バーを単純に更新したいと考えています。

これを実現するためにいくつかのサンプル コードを変更しましたが、次のエラーがスローされます。

path/ProgressDialog.py", line 31, in OnTimer
    (keepGoing, skip) = self.dialog.Update(self.count)
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 2971, in Update
return _windows_.ProgressDialog_Update(*args, **kwargs)
PyAssertionError: C++ assertion "value <= m_maximum" failed at ..\..\src\generic\progdlgg.cpp(337) in wxProgressDialog::Update(): invalid progress value

以下のコードに try...except ステートメントを追加すると、エラーはスローされませんが、単にエラー メッセージの上にイチジクの葉を描くよりも、これを行うためのより良い方法があるに違いないと考えています。

誰かが私のコードを修正する方法を教えてもらえますか?

エラーを「削除」する try...except ステートメントを含む、私のコードは次のとおりです。

import wx
import time

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="ProgressDialog sample")
        self.progressMax = 7
        self.count = 0
        self.dialog = None
        #self.timer = wx.Timer(self)
        #self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        #self.timer.Start(1000)
        self.OnTimer(self.count)

    def OnTimer(self, evt):
        try:
            if not self.dialog:
                self.dialog = wx.ProgressDialog("A progress box", "Time remaining",
                                                self.progressMax,
                                                style=wx.PD_CAN_ABORT
                                                | wx.PD_ELAPSED_TIME
                                                | wx.PD_REMAINING_TIME
                                                | wx.PD_ESTIMATED_TIME
                                                | wx.PD_AUTO_HIDE)

            while self.count < 8:
                self.count += 1
                if wx.VERSION < (2,7,1,1):
                    keepGoing = self.dialog.Update(self.count)
                else:
                    (keepGoing, skip) = self.dialog.Update(self.count)
                time.sleep(2)
            if not keepGoing or self.count == self.progressMax:
                self.dialog.Destroy()
                #self.timer.Stop()
        except:
            pass

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = Frame(None)
    frame.Show()
    app.MainLoop()

注: このコードをテストしている間、while ループを使用してプロセス ステップのステップ実行をシミュレートしています。しかし、実際の実装では、self.count が 1 増加するたびに、特定のプロセス ステップが発生するようにします。

4

1 に答える 1

1

あなたprogressMaxは7で、ループcountは8未満でcountループしますが、ループの最初の行で増分するため、は8である反復があり、これcountはプログレスバーの不正な値です。

while条件をcount < 7(便利なcount < progressMax)に変更するか、count増分をループの最後に移動します。

于 2010-10-28T07:27:35.917 に答える