Во-первых, 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
. Не только для того, чтобы вы могли печатать значения переменных, но также для печати комментариев, которые могут показать путь через ваш код.