Мне нужно включить индикатор выполнения в мое приложение 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 ... кроме в приведенном ниже коде, он не выдает ошибку, но я думаю, что должно бытьлучший способ сделать это, чем просто нарисовать фиговый листок над сообщением об ошибке.
Может кто-нибудь показать мне, как исправить мой код?
Мой код выглядит следующим образом, включая оператор try ... Кроме того, который «удаляет» ошибку:
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.