Обработка ошибок WXPython и повторное использование - PullRequest
2 голосов
/ 28 января 2011

У меня есть приложение wx python, которое выполняет серию шагов для определенного ввода, когда вы нажимаете на кнопку.Приложение работает в первый раз, но затем выдает ошибку, если я пытаюсь нажать кнопку еще раз с другим значением ввода.

У меня есть два вопроса: 1.) Как мне исправить мой кодниже, чтобы оно перестало выдавать это сообщение об ошибке?

2.) Какой конкретный код я должен добавить, чтобы любое сообщение об ошибке, подобное этому, показывалось конечному пользователю в диалоговом окне?Я хотел бы, чтобы он мог изящно убить весь процесс, который вызвал ошибку (начиная с нажатия кнопки) и заменить индикатор выполнения новым диалоговым окном, которое выдает сообщение об ошибке и позволяет пользователю нажать кнопку, которая будет приниматьони возвращаются в главное окно приложения, чтобы они могли снова нажать кнопку, чтобы оно работало с новым вводом.Я собираюсь обернуть это в исполняемый файл в ближайшее время, но сейчас единственной обработкой ошибок, которую я имею, является сообщение об ошибке в оболочке python.Поскольку у пользователей не будет оболочки Python, мне нужны сообщения об ошибках, описанные в этом параграфе.Обратите внимание, что моя функция OnClick () здесь создает экземпляр класса.Я использую несколько различных классов в моем реальном коде, каждый из которых очень сложен, и мне нужна функциональность, о которой я здесь прошу, чтобы иметь возможность обрабатывать ошибки, которые происходят глубоко в недрах различных классов, которые используются.создается с помощью функции OnClick ().

Вот очень упрощенная, но рабочая версия моего кода:

import wxversion
import wx
ID_EXIT = 130

class MainWindow(wx.Frame):
    def __init__(self, parent,id,title):
        wx.Frame.__init__(self,parent,wx.ID_ANY,title, size = (500,500), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)

        # A button
        self.button =wx.Button(self, label="Click Here", pos=(160, 120))
        self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)

        # the combobox Control
        self.sampleList = ['first','second','third']
        self.lblhear = wx.StaticText(self, label="Choose TestID to filter:", pos=(20, 75))
        self.edithear = wx.ComboBox(self, pos=(160, 75), size=(95, -1), choices=self.sampleList, style=wx.CB_DROPDOWN)

        # the progress bar
        self.progressMax = 3
        self.count = 0
        self.newStep='step '+str(self.count)
        self.dialog = None

        #-------Setting up the menu.
        # create a new instance of the wx.Menu() object
        filemenu = wx.Menu()

        # enables user to exit the program gracefully
        filemenu.Append(ID_EXIT, "E&xit", "Terminate the program")

        #------- Creating the menu.
        # create a new instance of the wx.MenuBar() object
        menubar = wx.MenuBar()
        # add our filemenu as the first thing on this menu bar
        menubar.Append(filemenu,"&File")
        # set the menubar we just created as the MenuBar for this frame
        self.SetMenuBar(menubar)
        #----- Setting menu event handler
        wx.EVT_MENU(self,ID_EXIT,self.OnExit)

        self.Show(True)

    def OnExit(self,event):
        self.Close(True)

    def OnClick(self,event):
        #SECOND EDIT: added try: statement to the next line:
        try:
            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)
            self.count += 1
            self.newStep='Start'
            (keepGoing, skip) = self.dialog.Update(self.count,self.newStep)
            TestID = self.edithear.GetValue()

            self.count += 1
            self.newStep='Continue.'
            (keepGoing, skip) = self.dialog.Update(self.count,self.newStep)
            myObject=myClass(TestID)
            print myObject.description

            self.count += 1
            self.newStep='Finished.'
            (keepGoing, skip) = self.dialog.Update(self.count,self.newStep)

            **#FIRST EDIT: Added self.count = 0 on the following line**
            self.count = 0

            self.dialog.Destroy()

        #SECOND EDIT: Added the next seven lines to handle exceptions.
        except:
            self.dialog.Destroy()
            import sys, traceback
            xc = traceback.format_exception(*sys.exc_info())
            d = wx.MessageDialog( self, ''.join(xc),"Error",wx.OK)
            d.ShowModal() # Show it
            d.Destroy() #finally destroy it when finished


    class myClass():
        def __init__(self,TestID):
            self.description = 'The variable name is:  '+str(TestID)+'. '

app = wx.PySimpleApp()
frame = MainWindow(None,-1,"My GUI")
app.MainLoop()

Мой настоящий код ОЧЕНЬ более сложен, но я создал эту фиктивную версиюоб этом, чтобы проиллюстрировать проблемы с ним.Этот код выше работает, когда я запускаю его в python при первом нажатии кнопки.Но если я попытаюсь нажать кнопку еще раз, я получу следующее сообщение об ошибке в оболочке python:

Traceback (most recent call last):
  File "mypath/GUIdiagnostics.py", line 55, in OnClick
    (keepGoing, skip) = self.dialog.Update(self.count,self.newStep)
  File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 2971, in Update
    return _windows_.ProgressDialog_Update(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "value <= m_maximum" failed at ..\..\src\generic\progdlgg.cpp(337) in wxProgressDialog::Update(): invalid progress value

ПЕРВОЕ РЕДАКТИРОВАНИЕ: ОК, я ответил первымвопрос выше, добавив

self.count = 0

выше

self.dialog.Destroy()

в коде выше.Но как насчет моего второго вопроса об обработке ошибок в коде выше?Кто-нибудь может мне помочь с этим?Конечно, обработка ошибок в wxpython является распространенной проблемой, для которой существуют известные методы.Я собираюсь использовать py2exe, чтобы обернуть это приложение в exe-файл.


ВТОРОЕ РЕДАКТИРОВАНИЕ: Я ответил на мой второй вопрос выше с заявлением try:, кроме:добавили в мой код выше.Забавно, это первый раз, когда никто из переполненных стеков не смог ответить на мой вопрос.Я новичок в этом типе программирования, поэтому многие вещи я просто собираю по мере их поступления.На этот вопрос теперь дан ответ.

...