wx.ProgressDialog не обновляет bar или newmsg - PullRequest
0 голосов
/ 28 октября 2010

Метод обновления wx.ProgressDialog имеет аргумент newmsg, который должен дать текстовое обновление о том, что происходит на каждом этапе процесса, но мой код делает это неправильно.

Вот ссылка на документацию для wx.ProgressDialog http://www.wxpython.org/docs/api/wx.ProgressDialog-class.html

Кроме того, когда я запускаю свой код, индикатор выполнения сам перестает обновляться, когда завершается примерно на 50 процентов.

Может кто-нибудь показать мне, как исправить эти две проблемы?

Вот мой код:

import wx
import time

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="ProgressDialog sample")
        self.progressMax = 4
        self.count = 0
        self.newstep='step '+str(self.count)
        self.dialog = None
        self.OnTimer(self.count)

    def OnTimer(self, evt):
        if not self.dialog:
            self.dialog = wx.ProgressDialog("Progress in processing your data.",
                                        self.newstep,
                                        self.progressMax,
                                        style=wx.PD_CAN_ABORT
                                        | wx.PD_APP_MODAL
                                        | wx.PD_SMOOTH
                                        | wx.PD_AUTO_HIDE)
        # Do Step One
        print '----------------------------'
        print 'Starting Step One now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Two
        print '----------------------------'
        print 'Starting Step Two now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Three
        print '----------------------------'
        print 'Starting Step Three now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Do Step Four
        print '----------------------------'
        print 'Starting Step Four now.'
        self.count += 1
        self.newstep='step '+str(self.count)
        print 'self.count is:  ',self.count
        print 'self.newstep is:  ',self.newstep
        keepGoing = self.dialog.Update(self.count,self.newstep)
        print '----------------------------'
        time.sleep(5)

        # Delete the progress bar when it is full
        self.dialog.Update(self.progressMax)
        time.sleep(3)
        self.dialog.Destroy()

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

Обратите внимание, что я распечатываю все, чтобы проверить прогресс. Результат команд печати отличается от того, что показано в диалоговом окне прогресса. Команды печати, кажется, делают то, что говорит им код, но диалог прогресса, кажется, не делает то, что говорит код, и диалог прогресса не согласуется с результатом команд печати .
Это в версии 2.6 Python.

РЕДАКТИРОВАТЬ Один:

----------------------------------------------- --------------------------------

Я отредактировал код выше, чтобы соответствовать предложениям adw. Проблема не обновления newmsg, похоже, была устранена, но сама индикатор выполнения по-прежнему заполнен только на 50%, и это происходит, когда вывод newmsg в диалоговом окне говорит «шаг 3». Затем индикатор выполнения исчезает. Лица, не использующие компьютер, использующие это программное обеспечение, могут реально подумать, что процесс завершил только около 50% своей работы, завершив работу в начале шага 3. Как я могу отредактировать код, чтобы он показывал «шаг 4» диалоговое окно, и, таким образом, индикатор выполнения заполняется на 100% за секунду или две до уничтожения ProgressDialog?

Редактировать два:

----------------------------------------------- -------------------------------

Я добавил изменения, предложенные ChrisC, в приведенный выше код, как вы можете видеть. Но запуск этого недавно измененного кода все еще вызывает ту же проблему. Так что предложение, похоже, не работает в той форме, которую я понял, когда редактировал код выше. Можете ли вы предложить что-то конкретное, что я могу сделать с приведенным выше кодом? Есть ли что-нибудь, что заставляет его работать на вашем компьютере?

Ответы [ 3 ]

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

Ваша проблема wx.PD_AUTO_HIDE.Как сказано в документации, использование этого стиля

Заставляет диалоговое окно прогресса исчезать с экрана, как только будет достигнуто максимальное значение индикатора прогресса.Измените свой код на

self.dialog = wx.ProgressDialog("Progress in processing your data.",
                                    self.newstep,
                                    self.progressMax,
                                    style=wx.PD_CAN_ABORT
                                    | wx.PD_APP_MODAL
                                    | wx.PD_SMOOTH)

Тогда код, предложенный ChrisC, будет работать.

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

Идентификаторы Python чувствительны к регистру, поэтому newstep отличается от newStep.

Что касается самой панели, она работает правильно, когда я запускаю ваш код. Хотя мне приходилось везде менять (keepGoing, skip) на keepGoing, возможно, разница в версии (у меня wx.VERSION_STRING == '2.6.3.2').

0 голосов
/ 29 октября 2010

Можете ли вы позвонить self.dialog.Update(self.progressMax) до self.dialog.Destroy(), может быть, с time.sleep(1) для видимой паузы?

...