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

📄 pythoneditor.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 2 页
字号:
            if isinstance(doc, PythonInterpreterDocument):                doc.DeleteAllViews()                return                        for template in self.GetDocumentManager().GetTemplates():            if template.GetDocumentType() == PythonInterpreterDocument:                newDoc = template.CreateDocument('', wx.lib.docview.DOC_SILENT|wx.lib.docview.DOC_OPEN_ONCE)                if newDoc:                    newDoc.SetDocumentName(template.GetDocumentName())                    newDoc.SetDocumentTemplate(template)                    newDoc.OnNewDocument()                    newDoc.SetWriteable(False)                    newDoc.GetFirstView().GetFrame().SetTitle(_("Python Interpreter"))                breakclass PythonCtrl(CodeEditor.CodeCtrl):    def __init__(self, parent, id=-1, style=wx.NO_FULL_REPAINT_ON_RESIZE):        CodeEditor.CodeCtrl.__init__(self, parent, id, style)        self.SetProperty("tab.timmy.whinge.level", "1")        self.SetProperty("fold.comment.python", "1")        self.SetProperty("fold.quotes.python", "1")        self.SetLexer(wx.stc.STC_LEX_PYTHON)        self.SetKeyWords(0, string.join(keyword.kwlist))    def CreatePopupMenu(self):        FINDCLASS_ID = wx.NewId()        FINDDEF_ID = wx.NewId()        menu = CodeEditor.CodeCtrl.CreatePopupMenu(self)        self.Bind(wx.EVT_MENU, self.OnPopFindDefinition, id=FINDDEF_ID)        menu.Insert(1, FINDDEF_ID, _("Find 'def'"))        self.Bind(wx.EVT_MENU, self.OnPopFindClass, id=FINDCLASS_ID)        menu.Insert(2, FINDCLASS_ID, _("Find 'class'"))        return menu    def OnPopFindDefinition(self, event):        view = wx.GetApp().GetDocumentManager().GetCurrentView()        if hasattr(view, "GetCtrl") and view.GetCtrl() and hasattr(view.GetCtrl(), "GetSelectedText"):            pattern = view.GetCtrl().GetSelectedText().strip()            if pattern:                searchPattern = "def\s+%s" % pattern                wx.GetApp().GetService(FindInDirService.FindInDirService).FindInProject(searchPattern)    def OnPopFindClass(self, event):        view = wx.GetApp().GetDocumentManager().GetCurrentView()        if hasattr(view, "GetCtrl") and view.GetCtrl() and hasattr(view.GetCtrl(), "GetSelectedText"):            definition = "class\s+%s"            pattern = view.GetCtrl().GetSelectedText().strip()            if pattern:                searchPattern = definition % pattern                wx.GetApp().GetService(FindInDirService.FindInDirService).FindInProject(searchPattern)    def SetViewDefaults(self):        CodeEditor.CodeCtrl.SetViewDefaults(self, configPrefix="Python", hasWordWrap=True, hasTabs=True, hasFolding=True)    def GetFontAndColorFromConfig(self):        return CodeEditor.CodeCtrl.GetFontAndColorFromConfig(self, configPrefix = "Python")    def UpdateStyles(self):        CodeEditor.CodeCtrl.UpdateStyles(self)        if not self.GetFont():            return        faces = { 'font' : self.GetFont().GetFaceName(),                  'size' : self.GetFont().GetPointSize(),                  'size2': self.GetFont().GetPointSize() - 2,                  'color' : "%02x%02x%02x" % (self.GetFontColor().Red(), self.GetFontColor().Green(), self.GetFontColor().Blue())                  }        # Python styles        # White space        self.StyleSetSpec(wx.stc.STC_P_DEFAULT, "face:%(font)s,fore:#000000,face:%(font)s,size:%(size)d" % faces)        # Comment        self.StyleSetSpec(wx.stc.STC_P_COMMENTLINE, "face:%(font)s,fore:#007F00,italic,face:%(font)s,size:%(size)d" % faces)        # Number        self.StyleSetSpec(wx.stc.STC_P_NUMBER, "face:%(font)s,fore:#007F7F,size:%(size)d" % faces)        # String        self.StyleSetSpec(wx.stc.STC_P_STRING, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces)        # Single quoted string        self.StyleSetSpec(wx.stc.STC_P_CHARACTER, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces)        # Keyword        self.StyleSetSpec(wx.stc.STC_P_WORD, "face:%(font)s,fore:#00007F,bold,size:%(size)d" % faces)        # Triple quotes        self.StyleSetSpec(wx.stc.STC_P_TRIPLE, "face:%(font)s,fore:#7F0000,size:%(size)d" % faces)        # Triple double quotes        self.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, "face:%(font)s,fore:#7F0000,size:%(size)d" % faces)        # Class name definition        self.StyleSetSpec(wx.stc.STC_P_CLASSNAME, "face:%(font)s,fore:#0000FF,bold,size:%(size)d" % faces)        # Function or method name definition        self.StyleSetSpec(wx.stc.STC_P_DEFNAME, "face:%(font)s,fore:#007F7F,bold,size:%(size)d" % faces)        # Operators        self.StyleSetSpec(wx.stc.STC_P_OPERATOR, "face:%(font)s,size:%(size)d" % faces)        # Identifiers        self.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, "face:%(font)s,fore:#%(color)s,face:%(font)s,size:%(size)d" % faces)        # Comment-blocks        self.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, "face:%(font)s,fore:#7F7F7F,size:%(size)d" % faces)        # End of line where string is not closed        self.StyleSetSpec(wx.stc.STC_P_STRINGEOL, "face:%(font)s,fore:#000000,face:%(font)s,back:#E0C0E0,eol,size:%(size)d" % faces)    def OnUpdateUI(self, evt):        braces = self.GetMatchingBraces()                # check for matching braces        braceAtCaret = -1        braceOpposite = -1        charBefore = None        caretPos = self.GetCurrentPos()        if caretPos > 0:            charBefore = self.GetCharAt(caretPos - 1)            styleBefore = self.GetStyleAt(caretPos - 1)        # check before        if charBefore and chr(charBefore) in braces and styleBefore == wx.stc.STC_P_OPERATOR:            braceAtCaret = caretPos - 1        # check after        if braceAtCaret < 0:            charAfter = self.GetCharAt(caretPos)            styleAfter = self.GetStyleAt(caretPos)            if charAfter and chr(charAfter) in braces and styleAfter == wx.stc.STC_P_OPERATOR:                braceAtCaret = caretPos        if braceAtCaret >= 0:            braceOpposite = self.BraceMatch(braceAtCaret)        if braceAtCaret != -1  and braceOpposite == -1:            self.BraceBadLight(braceAtCaret)        else:            self.BraceHighlight(braceAtCaret, braceOpposite)        evt.Skip()    def DoIndent(self):        (text, caretPos) = self.GetCurLine()        self._tokenizerChars = {}  # This is really too much, need to find something more like a C array        for i in range(len(text)):            self._tokenizerChars[i] = 0        ctext = cStringIO.StringIO(text)        try:            tokenize.tokenize(ctext.readline, self)        except:            pass        # Left in for debugging purposes:        #for i in range(len(text)):        #    print i, text[i], self._tokenizerChars[i]        if caretPos == 0 or len(string.strip(text)) == 0:  # At beginning of line or within an empty line            self.AddText('\n')        else:            doExtraIndent = False            brackets = False            commentStart = -1            if caretPos > 1:                startParenCount = 0                endParenCount = 0                startSquareBracketCount = 0                endSquareBracketCount = 0                startCurlyBracketCount = 0                endCurlyBracketCount = 0                startQuoteCount = 0                endQuoteCount = 0                for i in range(caretPos - 1, -1, -1): # Go through each character before the caret                    if i >= len(text): # Sometimes the caret is at the end of the text if there is no LF                        continue                    if self._tokenizerChars[i] == 1:                        continue                    elif self._tokenizerChars[i] == 2:                        startQuoteCount = startQuoteCount + 1                    elif self._tokenizerChars[i] == 3:                        endQuoteCount = endQuoteCount + 1                    elif text[i] == '(': # Would be nice to use a dict for this, but the code is much more readable this way                        startParenCount = startParenCount + 1                    elif text[i] == ')':                        endParenCount = endParenCount + 1                    elif text[i] == "[":                        startSquareBracketCount = startSquareBracketCount + 1                    elif text[i] == "]":                        endSquareBracketCount = endSquareBracketCount + 1                    elif text[i] == "{":                        startCurlyBracketCount = startCurlyBracketCount + 1                    elif text[i] == "}":                        endCurlyBracketCount = endCurlyBracketCount + 1                    elif text[i] == "#":                        commentStart = i                        break                    if startQuoteCount > endQuoteCount or startParenCount > endParenCount or startSquareBracketCount > endSquareBracketCount or startCurlyBracketCount > endCurlyBracketCount:                        if i + 1 >= caretPos:  # Caret is right at the open paren, so just do indent as if colon was there                            doExtraIndent = True                            break                        else:                            spaces = " " * (i + 1)                            brackets = True                            break            if not brackets:                spaces = text[0:len(text) - len(string.lstrip(text))]                if caretPos < len(spaces):  # If within the opening spaces of a line                    spaces = spaces[:caretPos]                # strip comment off                if commentStart != -1:                    text = text[0:commentStart]                textNoTrailingSpaces = text[0:caretPos].rstrip()                if doExtraIndent or len(textNoTrailingSpaces) and textNoTrailingSpaces[-1] == ':':                    spaces = spaces + ' ' * self.GetIndent()            self.AddText('\n' + spaces)        self.EnsureCaretVisible()    # Callback for tokenizer in self.DoIndent    def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):        if toktype == tokenize.COMMENT:            for i in range(scol, ecol + 1):                self._validChars[i] = False        elif toktype == token.STRING:            self._tokenizerChars[scol] = 2 # Open quote            self._tokenizerChars[ecol - 1] = 3 # Close quote            for i in range(scol + 1, ecol - 2):                self._tokenizerChars[i] = 1 # Part of string, 1 == ignore the charclass PythonOptionsPanel(wx.Panel):    def __init__(self, parent, id):        wx.Panel.__init__(self, parent, id)        pathLabel = wx.StaticText(self, -1, _("python.exe Path:"))        config = wx.ConfigBase_Get()        path = config.Read("ActiveGridPythonLocation")        self._pathTextCtrl = wx.TextCtrl(self, -1, path, size = (150, -1))        self._pathTextCtrl.SetToolTipString(self._pathTextCtrl.GetValue())        self._pathTextCtrl.SetInsertionPointEnd()        choosePathButton = wx.Button(self, -1, _("Browse..."))        pathSizer = wx.BoxSizer(wx.HORIZONTAL)        HALF_SPACE = 5        SPACE = 10        pathSizer.Add(pathLabel, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.TOP, HALF_SPACE)        pathSizer.Add(self._pathTextCtrl, 1, wx.EXPAND|wx.LEFT|wx.TOP, HALF_SPACE)        pathSizer.Add(choosePathButton, 0, wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT|wx.TOP, HALF_SPACE)        wx.EVT_BUTTON(self, choosePathButton.GetId(), self.OnChoosePath)        mainSizer = wx.BoxSizer(wx.VERTICAL)                        mainSizer.Add(pathSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, SPACE)        self._otherOptions = STCTextEditor.TextOptionsPanel(self, -1, configPrefix = "Python", label = "Python", hasWordWrap = True, hasTabs = True, addPage=False, hasFolding=True)        mainSizer.Add(self._otherOptions, 0, wx.EXPAND|wx.BOTTOM, SPACE)        self.SetSizer(mainSizer)        parent.AddPage(self, _("Python"))            def OnChoosePath(self, event):        defaultDir = os.path.dirname(self._pathTextCtrl.GetValue().strip())        defaultFile = os.path.basename(self._pathTextCtrl.GetValue().strip())        if _WINDOWS:            wildcard = _("Executable (*.exe)|*.exe|All|*.*")            if not defaultFile:                defaultFile = "python.exe"        else:            wildcard = _("*")        dlg = wx.FileDialog(wx.GetApp().GetTopWindow(),                               _("Select a File"),                               defaultDir=defaultDir,                               defaultFile=defaultFile,                               wildcard=wildcard,                               style=wx.OPEN|wx.FILE_MUST_EXIST|wx.HIDE_READONLY)        # dlg.CenterOnParent()  # wxBug: caused crash with wx.FileDialog        if dlg.ShowModal() == wx.ID_OK:            path = dlg.GetPath()            if path:                  self._pathTextCtrl.SetValue(path)                self._pathTextCtrl.SetToolTipString(self._pathTextCtrl.GetValue())                self._pathTextCtrl.SetInsertionPointEnd()        dlg.Destroy()                def OnOK(self, optionsDialog):        config = wx.ConfigBase_Get()        config.Write("ActiveGridPythonLocation", self._pathTextCtrl.GetValue().strip())        self._otherOptions.OnOK(optionsDialog)            def GetIcon(self):        return getPythonIcon()        #----------------------------------------------------------------------------# Icon Bitmaps - generated by encode_bitmaps.py#----------------------------------------------------------------------------from wx import ImageFromStream, BitmapFromImageimport cStringIOdef getPythonData():    return \'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\\x00\x01\xe7IDAT8\x8d}\x921h\x13Q\x18\xc7\x7fw\xb9\x0ei\x9d*\xbd\xeb\x10\x8f\,\x99\x1c*A[\xaa\x19B\xe8\xd0\xb1\x0e%K\x87\x88T2\x88Cqp\tD\x14i\xe9\xe0V\\xdaQ\xb7\xe0P\xa1\x8b\xa0(\x95$z\xd5Q1\x90\xa2\xd7\x9a4^\x87\xa0`\x92!w9\\x87\xf8.\xb9\xa6\xc97\xbd\xef{\xef\xfb\xbd\xff\xfb\xbfO*~;v\xf9\x1f\xad\xba\\x05@\xf9\xd4\x06\xc0::$\xbb\x96\x92\x18\x11\n@(4\xdd\xcdB\xd3\xd4\x1d\x85\\x8b\x97\xe1\xe3;\x83\x99\xe5\x15\xb2\xe0\x8e\x82\xc8\xa3\xe8\x003\xcb+\xac\\xaee\xdda\xfb\xb2\x90\rPw\x14\x00\x9a\xb5\n\xbf\xfflSz\x9d\xa2Y\xdc"zca\xe8\\x05\xb2h\x14\xcd\xd0\xf3B\x9f\x98\xe5\xf9\xde\x13"\xaaB\xc7\xb1\xcfU!\x0b\\xc3D4k\x15\xac\x93\x03\xf4\x89Y\xaf\x96\xffT\x028\x17\xa2\xf4\'\xcdZ\x85\\xf7F\x06{\xaa\x80ev\xc1\x91\xb91>\x18\x0f\xb8\xb7\x95a\xe9\xca\x0b:\x8e\xed\\xca\x01E\x1a\x00\x98\r\x89\x92\x91\xa1\xda\xd8\x87\x06ha\x1f\x1b\x80\xcd\\x9d%\xe0\xa5\x0f"[G\x87\x98\x8d\xde/ia\x05-\xac`\x996\xf9\\\x0b\xcb\xb4)\\x1bmOMn\xf7\xd5\xf0\'\\\x8b\xdces\xe7\x8d\xef\x80h\xd6\xc2\n\xf9\\\x0b]\xf5\\xab\xf2\xcdApR#\xf1kp4b\xc9 \xf9\\\x0b\x80\xe4\xcdE\xaf\xdeqlW\xaeVL\xaf`~\\xd9\x03@W\xd3\x00\xc4\x13\x0b\xc4\x92A\xcf\xd0\xf9\xe8:\x89\xebW\x01(|\xfd\\xe1\xbe-~F\xbas\xff\x91\xf75\x82n\x9d\x1c\xf0}\xfciw\xdd\xe7A<\xd1\x1b\xa8j\c\x9f\xb2\xd1F\x92\xe4\x80O\x12\xc0\xc6\xb3\x14\xf6Ta\xe0)g\x81\xba\x9a\xf6\\x9b(\x07\x14I@\x84lq\xb8?\xe6\xa3\xeb\x00\xdc\xba\x9d\xf4+\x10*~\xfem\xf3\\xf8\xe1\x06\xc7\xa7\xdb\xe8j\x9a\xf8\xdc\xa4\xb7\x1f[\\\xe5\xd2\x851/\xff\\x07\xac\x9b\xd1e\x12\x96\x0f\xfd\x00\x00\x00\x00IEND\xaeB`\x82' def getPythonBitmap():    return BitmapFromImage(getPythonImage())def getPythonImage():    stream = cStringIO.StringIO(getPythonData())    return ImageFromStream(stream)def getPythonIcon():    return wx.IconFromBitmap(getPythonBitmap())

⌨️ 快捷键说明

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