wx.ProgressDialog с использованием счетчика вместо таймера - PullRequest
0 голосов
/ 28 октября 2010

Мне нужно включить индикатор выполнения в мое приложение 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.

1 Ответ

1 голос
/ 28 октября 2010

Ваш progressMax равен 7, и цикл зацикливается, в то время как count меньше 8, но вы увеличиваете count в первой строке цикла, поэтому у вас есть итерация, где count равно 8 и этонедопустимое значение для индикатора выполнения.

Либо измените условие while на count < 7 (удобно count < progressMax), либо переместите шаг count в конец цикла.

...