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 増加するたびに、特定のプロセス ステップが発生するようにします。