⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debuggerservice.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 5 页
字号:
                break    def StopExecution(self):        if not self._stopped:            self._stopped = True            self.Unbind(EVT_UPDATE_STDTEXT)            self.Unbind(EVT_UPDATE_ERRTEXT)            self._executor.DoStopExecution()    def AppendText(self, event):        self._textCtrl.SetReadOnly(False)        self._textCtrl.AddText(event.value)        self._textCtrl.ScrollToLine(self._textCtrl.GetLineCount())        self._textCtrl.SetReadOnly(True)    def AppendErrorText(self, event):        self._textCtrl.SetReadOnly(False)        self._textCtrl.SetFontColor(wx.RED)        self._textCtrl.StyleClearAll()        self._textCtrl.AddText(event.value)        self._textCtrl.ScrollToLine(self._textCtrl.GetLineCount())        self._textCtrl.SetFontColor(wx.BLACK)        self._textCtrl.StyleClearAll()        self._textCtrl.SetReadOnly(True)    def StopAndRemoveUI(self, event):        self.StopExecution()        self.StopExecution()        index = self._noteBook.GetSelection()        self._noteBook.GetPage(index).Show(False)        self._noteBook.RemovePage(index)    #------------------------------------------------------------------------------    # Event handling    #-----------------------------------------------------------------------------    def OnToolClicked(self, event):        id = event.GetId()        if id == self.KILL_PROCESS_ID:            self.StopExecution()        elif id == self.CLOSE_TAB_ID:            self.StopAndRemoveUI(event)    def OnDoubleClick(self, event):        # Looking for a stack trace line.        lineText, pos = self._textCtrl.GetCurLine()        fileBegin = lineText.find("File \"")        fileEnd = lineText.find("\", line ")        lineEnd = lineText.find(", in ")        if lineText == "\n" or  fileBegin == -1 or fileEnd == -1 or lineEnd == -1:            # Check the line before the one that was clicked on            lineNumber = self._textCtrl.GetCurrentLine()            if(lineNumber == 0):                return            lineText = self._textCtrl.GetLine(lineNumber - 1)            fileBegin = lineText.find("File \"")            fileEnd = lineText.find("\", line ")            lineEnd = lineText.find(", in ")            if lineText == "\n" or  fileBegin == -1 or fileEnd == -1 or lineEnd == -1:                return        filename = lineText[fileBegin + 6:fileEnd]        lineNum = int(lineText[fileEnd + 8:lineEnd])        foundView = None        openDocs = wx.GetApp().GetDocumentManager().GetDocuments()        for openDoc in openDocs:            if openDoc.GetFilename() == filename:                foundView = openDoc.GetFirstView()                break        if not foundView:            doc = wx.GetApp().GetDocumentManager().CreateDocument(filename, wx.lib.docview.DOC_SILENT)            foundView = doc.GetFirstView()        if foundView:            foundView.GetFrame().SetFocus()            foundView.Activate()            foundView.GotoLine(lineNum)            startPos = foundView.PositionFromLine(lineNum)            lineText = foundView.GetCtrl().GetLine(lineNum - 1)            foundView.SetSelection(startPos, startPos + len(lineText.rstrip("\n")))            import OutlineService            wx.GetApp().GetService(OutlineService.OutlineService).LoadOutline(foundView, position=startPos)DEFAULT_PORT = 32032DEFAULT_HOST = 'localhost'PORT_COUNT = 21class BaseDebuggerUI(wx.Panel):    debuggers = []    def NotifyDebuggersOfBreakpointChange():        for debugger in BaseDebuggerUI.debuggers:            debugger.BreakPointChange()    NotifyDebuggersOfBreakpointChange = staticmethod(NotifyDebuggersOfBreakpointChange)    def DebuggerRunning():        for debugger in BaseDebuggerUI.debuggers:            if debugger._executor:                return True        return False    DebuggerRunning = staticmethod(DebuggerRunning)    def DebuggerInWait():        for debugger in BaseDebuggerUI.debuggers:            if debugger._executor:                if debugger._callback._waiting:                    return True        return False    DebuggerInWait = staticmethod(DebuggerInWait)    def DebuggerPastAutoContinue():        for debugger in BaseDebuggerUI.debuggers:            if debugger._executor:                if debugger._callback._waiting and not debugger._callback._autoContinue:                    return True        return False    DebuggerPastAutoContinue = staticmethod(DebuggerPastAutoContinue)    def ShutdownAllDebuggers():        for debugger in BaseDebuggerUI.debuggers:            try:                debugger.StopExecution(None)            except wx._core.PyDeadObjectError:                pass        BaseDebuggerUI.debuggers = []    ShutdownAllDebuggers = staticmethod(ShutdownAllDebuggers)    def __init__(self, parent, id):        wx.Panel.__init__(self, parent, id)        self._parentNoteBook = parent        self._service = None        self._executor = None        self._callback = None        self._stopped = False        BaseDebuggerUI.debuggers.append(self)        self._stopped = True        self.Bind(EVT_UPDATE_STDTEXT, self.AppendText)        self.Bind(EVT_UPDATE_ERRTEXT, self.AppendErrorText)        self._executor = None        self.STEP_ID = wx.NewId()        self.CONTINUE_ID = wx.NewId()        self.STEP_OUT_ID = wx.NewId()        self.NEXT_ID = wx.NewId()        self.KILL_PROCESS_ID = wx.NewId()        self.CLOSE_WINDOW_ID = wx.NewId()        self.BREAK_INTO_DEBUGGER_ID = wx.NewId()        self.CLEAR_ID = wx.NewId()        self.ADD_WATCH_ID = wx.NewId()        sizer = wx.BoxSizer(wx.VERTICAL)        self._tb = tb = wx.ToolBar(self,  -1, wx.DefaultPosition, (1000,30), wx.TB_HORIZONTAL| wx.NO_BORDER| wx.TB_FLAT| wx.TB_TEXT, "Debugger" )        sizer.Add(tb, 0, wx.EXPAND |wx.ALIGN_LEFT|wx.ALL, 1)        tb.SetToolBitmapSize((16,16))        close_bmp = getCloseBitmap()        tb.AddSimpleTool( self.CLOSE_WINDOW_ID, close_bmp, _('Close Window'))        wx.EVT_TOOL(self, self.CLOSE_WINDOW_ID, self.StopAndRemoveUI)        stop_bmp = getStopBitmap()        tb.AddSimpleTool( self.KILL_PROCESS_ID, stop_bmp, _("Stop Debugging"))        wx.EVT_TOOL(self, self.KILL_PROCESS_ID, self.StopExecution)        tb.AddSeparator()        break_bmp = getBreakBitmap()        tb.AddSimpleTool( self.BREAK_INTO_DEBUGGER_ID, break_bmp, _("Break into Debugger"))        wx.EVT_TOOL(self, self.BREAK_INTO_DEBUGGER_ID, self.BreakExecution)        tb.AddSeparator()        continue_bmp = getContinueBitmap()        tb.AddSimpleTool( self.CONTINUE_ID, continue_bmp, _("Continue Execution"))        wx.EVT_TOOL(self, self.CONTINUE_ID, self.OnContinue)        self.Bind(EVT_DEBUG_INTERNAL, self.OnContinue)        tb.AddSeparator()        next_bmp = getNextBitmap()        tb.AddSimpleTool( self.NEXT_ID, next_bmp, _("Step to next line"))        wx.EVT_TOOL(self, self.NEXT_ID, self.OnNext)        step_bmp = getStepInBitmap()        tb.AddSimpleTool( self.STEP_ID, step_bmp, _("Step in"))        wx.EVT_TOOL(self, self.STEP_ID, self.OnSingleStep)        stepOut_bmp = getStepReturnBitmap()        tb.AddSimpleTool(self.STEP_OUT_ID, stepOut_bmp, _("Stop at function return"))        wx.EVT_TOOL(self, self.STEP_OUT_ID, self.OnStepOut)        tb.AddSeparator()        if _WATCHES_ON:            watch_bmp = getAddWatchBitmap()            tb.AddSimpleTool(self.ADD_WATCH_ID, watch_bmp, _("Add a watch"))            wx.EVT_TOOL(self, self.ADD_WATCH_ID, self.OnAddWatch)            tb.AddSeparator()        clear_bmp = getClearOutputBitmap()        tb.AddSimpleTool(self.CLEAR_ID, clear_bmp, _("Clear output pane"))        wx.EVT_TOOL(self, self.CLEAR_ID, self.OnClearOutput)        self._toolEnabled = True        self.framesTab = None        self.DisableWhileDebuggerRunning()        self.framesTab = self.MakeFramesUI(self, wx.NewId(), None)        sizer.Add(self.framesTab, 1, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 1)        self._statusBar = wx.StatusBar( self, -1)        self._statusBar.SetFieldsCount(1)        sizer.Add(self._statusBar, 0, wx.EXPAND |wx.ALIGN_LEFT|wx.ALL, 1)        self.SetStatusText("Starting debug...")        self.SetSizer(sizer)        tb.Realize()        sizer.Fit(self)    def OnSingleStep(self, event):        self._callback.SingleStep()    def OnContinue(self, event):        self._callback.Continue()    def OnStepOut(self, event):        self._callback.Return()    def OnNext(self, event):        self._callback.Next()    def BreakPointChange(self):        if not self._stopped:            self._callback.PushBreakpoints()        self.framesTab.PopulateBPList()    def __del__(self):        # See comment on PythonDebuggerUI.StopExecution        self.StopExecution(None)    def DisableWhileDebuggerRunning(self):        if self._toolEnabled:            self._tb.EnableTool(self.STEP_ID, False)            self._tb.EnableTool(self.CONTINUE_ID, False)            self._tb.EnableTool(self.STEP_OUT_ID, False)            self._tb.EnableTool(self.NEXT_ID, False)            self._tb.EnableTool(self.BREAK_INTO_DEBUGGER_ID, True)                if _WATCHES_ON:                self._tb.EnableTool(self.ADD_WATCH_ID, False)                self.DeleteCurrentLineMarkers()                if self.framesTab:                self.framesTab.ClearWhileRunning()            self._toolEnabled = False    def EnableWhileDebuggerStopped(self):        self._tb.EnableTool(self.STEP_ID, True)        self._tb.EnableTool(self.CONTINUE_ID, True)        self._tb.EnableTool(self.STEP_OUT_ID, True)        self._tb.EnableTool(self.NEXT_ID, True)        self._tb.EnableTool(self.BREAK_INTO_DEBUGGER_ID, False)        self._tb.EnableTool(self.KILL_PROCESS_ID, True)        if _WATCHES_ON:            self._tb.EnableTool(self.ADD_WATCH_ID, True)        self._toolEnabled = True    def DisableAfterStop(self):        if self._toolEnabled:            self.DisableWhileDebuggerRunning()            self._tb.EnableTool(self.BREAK_INTO_DEBUGGER_ID, False)            self._tb.EnableTool(self.KILL_PROCESS_ID, False)    def ExecutorFinished(self):        if _VERBOSE: print "In ExectorFinished"        try:            self.DisableAfterStop()        except wx._core.PyDeadObjectError:            pass        try:            nb = self.GetParent()            for i in range(0, nb.GetPageCount()):                if self == nb.GetPage(i):                    text = nb.GetPageText(i)                    newText = text.replace("Debugging", "Finished")                    nb.SetPageText(i, newText)                    if _VERBOSE: print "In ExectorFinished, changed tab title."                    break        except:            if _VERBOSE: print "In ExectorFinished, got exception"    def SetStatusText(self, text):        self._statusBar.SetStatusText(text,0)    def BreakExecution(self, event):        self._callback.BreakExecution()    def StopExecution(self, event):        self._callback.ShutdownServer()    def Execute(self, initialArgs, startIn, environment, onWebServer = False):        assert False, "Execute not overridden"    def SynchCurrentLine(self, filename, lineNum, noArrow=False):        self.DeleteCurrentLineMarkers()        # Filename will be <string> if we're in a bit of code that was executed from        # a string (rather than a file). I haven't been able to get the original string        # for display.        if filename == '<string>':            return        foundView = None        openDocs = wx.GetApp().GetDocumentManager().GetDocuments()        for openDoc in openDocs:            # This ugliness to prevent comparison failing because the drive letter            # gets lowercased occasionally. Don't know why that happens or why  it            # only happens occasionally.            if DebuggerService.ComparePaths(openDoc.GetFilename(),filename):                foundView = openDoc.GetFirstView()                break        if not foundView:            if _VERBOSE:                print "filename=", filename            doc = wx.GetApp().GetDocumentManager().CreateDocument(DebuggerService.ExpandPath(filename), wx.lib.docview.DOC_SILENT)            foundView = doc.GetFirstView()        if foundView:            foundView.GetFrame().SetFocus()            foundView.Activate()            foundView.GotoLine(lineNum)            startPos = foundView.PositionFromLine(lineNum)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -