Как распознать окончание файла в wxPython? - PullRequest
0 голосов
/ 03 ноября 2018

Я сделал текстовый редактор с поддержкой подсветки синтаксиса для Python. У меня есть функция Open file, и она должна распознавать расширение имени файла, и если это .py, он установит для лексера значение Python и все остальное, с которым он ничего не будет делать. Я открыл файл Python, но подсветка Synatx не работает, что я делаю не так?

import wx
import wx.stc as stc
import os

class Window(wx.Frame):
    def __init__(self, parent, title):
        self.filename = ''
        self.dirname = ''

        wx.Frame.__init__(self, parent, title=title, size=(500, 500))
        self.control = stc.StyledTextCtrl(self, style=wx.TE_MULTILINE | wx.TE_WORDWRAP)
        self.FileMenu(), self.Menu(), self.Binds()

    def FileMenu(self):
        self.filemenu = wx.Menu()
        self.open = self.filemenu.Append(wx.ID_ANY, "&Open", "Open file")

    def Menu(self):
        self.menu = wx.MenuBar()
        self.menu.Append(self.filemenu, "&File")
        self.SetMenuBar(self.menu)

    def Binds(self):
        self.Bind(wx.EVT_MENU, self.Open, self.open)

    def Open(self, e):
        try:
            dlg = wx.FileDialog(self, "Select a file", self.dirname, "", "*.*", wx.FD_OPEN)
            if(dlg.ShowModal() == wx.ID_OK):
                self.filename = dlg.GetFilename()
                self.dirname = dlg.GetDirectory()
                self.wildcard = dlg.GetWildcard()
                if self.wildcard == ".py":
                    self.Python()
                else:
                    pass
                f = open(os.path.join(self.dirname, self.filename), 'r')
                self.control.SetValue(f.read())
                f.close()
            dlg.Destroy()
        except:
            dlg = wx.MessageDialog(self, "Error loading file", "Error", wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()

    def Python(self, e):
        self.lexer = self.control.SetLexer(stc.STC_LEX_PYTHON)
        self.control.SetKeyWords(0, " ".join(keyword.kwlist))
        self.control.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000')
        self.control.StyleSetSpec(wx.stc.STC_P_COMMENTLINE, 'fore:#008000')
        self.control.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#008000')
        self.control.StyleSetSpec(wx.stc.STC_P_NUMBER, 'fore:#008080')
        self.control.StyleSetSpec(wx.stc.STC_P_STRING, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_CHARACTER, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_WORD, 'fore:#000080')
        self.control.StyleSetSpec(wx.stc.STC_P_TRIPLE, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_CLASSNAME, 'fore:#0000FF')
        self.control.StyleSetSpec(wx.stc.STC_P_DEFNAME, 'fore:#008080')
        self.control.StyleSetSpec(wx.stc.STC_P_OPERATOR, 'fore:#800000')
        self.control.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, 'fore:#000000')

def main():
    app = wx.App()
    frame = Window(None, "Text Editor")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 03 ноября 2018

Во-первых, self.wildcard будет тем, что вы установили, то есть *.*, а НЕ суффиксом файла, который вы выбрали.
Таким образом, вам нужен способ определить суффикс выбранного файла. Я предлагаю функцию rsplit, используя последний пункт, см. Ниже.
Во-вторых, функция Python не запускается event, поэтому def Python(self, e): должно быть def Python(self):
Наконец, вы не предоставили keyword.kwlist. Это не будет отображаться как ошибка, потому что вы завернули код в try ... except, поэтому он тихо завершится с ошибкой.
Попробуйте следующее:

import wx
import wx.stc as stc
import os

class Window(wx.Frame):
    def __init__(self, parent, title):
        self.filename = ''
        self.dirname = ''

        wx.Frame.__init__(self, parent, title=title, size=(500, 500))
        self.control = stc.StyledTextCtrl(self, style=wx.TE_MULTILINE | wx.TE_WORDWRAP)
        self.FileMenu(), self.Menu(), self.Binds()

    def FileMenu(self):
        self.filemenu = wx.Menu()
        self.open = self.filemenu.Append(wx.ID_ANY, "&Open", "Open file")

    def Menu(self):
        self.menu = wx.MenuBar()
        self.menu.Append(self.filemenu, "&File")
        self.SetMenuBar(self.menu)

    def Binds(self):
        self.Bind(wx.EVT_MENU, self.Open, self.open)

    def Open(self, e):
        try:
            dlg = wx.FileDialog(self, "Select a file", self.dirname, "", "*.*", wx.FD_OPEN)
            if(dlg.ShowModal() == wx.ID_OK):
                self.filename = dlg.GetFilename()
                self.dirname = dlg.GetDirectory()
                self.suffix = self.filename.rsplit('.')[-1]
                if self.suffix == "py":
                    self.Python()
                else:
                    pass
                f = open(os.path.join(self.dirname, self.filename), 'r')
                self.control.SetValue(f.read())
                f.close()
            dlg.Destroy()
        except:
            dlg = wx.MessageDialog(self, "Error loading file", "Error", wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()

    def Python(self):
        self.lexer = self.control.SetLexer(stc.STC_LEX_PYTHON)
        #self.control.SetKeyWords(0, " ".join(keyword.kwlist))
        self.control.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000')
        self.control.StyleSetSpec(wx.stc.STC_P_COMMENTLINE, 'fore:#008000')
        self.control.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#008000')
        self.control.StyleSetSpec(wx.stc.STC_P_NUMBER, 'fore:#008080')
        self.control.StyleSetSpec(wx.stc.STC_P_STRING, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_CHARACTER, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_WORD, 'fore:#000080')
        self.control.StyleSetSpec(wx.stc.STC_P_TRIPLE, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, 'fore:#800080')
        self.control.StyleSetSpec(wx.stc.STC_P_CLASSNAME, 'fore:#0000FF')
        self.control.StyleSetSpec(wx.stc.STC_P_DEFNAME, 'fore:#008080')
        self.control.StyleSetSpec(wx.stc.STC_P_OPERATOR, 'fore:#800000')
        self.control.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, 'fore:#000000')

def main():
    app = wx.App()
    frame = Window(None, "Text Editor")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

N.B. Когда что-то не получается quietly и это в операторе try, удалите try, чтобы увидеть ошибку.
Если ничего не помогает, самым надежным средством отладки остается команда print. Не только для того, чтобы вы могли печатать значения переменных, но также для печати комментариев, которые могут показать путь через ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...