実現したいこと
wxPythonでインデント階層の折りたたみが可能なエディタを作りたいです。
前提
Python3でインデント階層の折りたたみが可能なエディタをつくっています。GUIはwxPythonを使う予定です。
発生している問題・エラーメッセージ
エラーは出ませんが、起動したウィンドウにフォールドアイコンが表示されず、どこをクリックしても折りたたみが動作しません。
該当のソースコード
Python3
1import wx 2import wx.stc 3 4class TextEditor(wx.Frame): 5 def __init__(self, parent, title): 6 wx.Frame.__init__(self, parent, title=title, size=(800, 600)) 7 8 self.text = wx.stc.StyledTextCtrl(self) 9 self.text.SetMarginType(1, wx.stc.STC_MARGIN_NUMBER) 10 self.text.SetMarginWidth(1, 25) 11 12 # 折りたたみ用のスタイルを設定 13 self.text.SetFoldFlags(wx.stc.STC_FOLDFLAG_LINEBEFORE_CONTRACTED | wx.stc.STC_FOLDFLAG_LINEAFTER_CONTRACTED) 14 self.text.SetMarginType(2, wx.stc.STC_MARGIN_SYMBOL) 15 self.text.SetMarginMask(2, wx.stc.STC_MASK_FOLDERS) 16 self.text.SetLexer(wx.stc.STC_LEX_PYTHON) 17 self.text.StyleClearAll() 18 self.text.SetMarginSensitive(2, True) 19 self.text.SetMarginWidth(2, 20) 20 self.text.SetFoldMarginHiColour(True, wx.Colour(255, 255, 255)) 21 22 # テキストを設定 23 text = """\ 24# ファイルの先頭 25def func1(): 26 print("Hello") 27 print("World") 28 29def func2(): 30 print("Goodbye") 31 print("World") 32 33# ファイルの末尾""" 34 self.text.SetText(text) 35 36 # マージン2をクリックしたときに折りたたむ 37 self.text.Bind(wx.stc.EVT_STC_MARGINCLICK, self.on_margin_click, self.text) 38 39 def on_margin_click(self, event): 40 # マージン2の場合 41 if event.GetMargin() == 2: 42 line_number = self.text.LineFromPosition(event.GetPosition()) 43 44 # 現在の行がフォールドヘッダーである場合、その行をトグルする 45 if self.text.GetFoldLevel(line_number) & wx.stc.STC_FOLDLEVELHEADERFLAG: 46 self.text.ToggleFold(line_number) 47 else: 48 # 現在の行がフォールドヘッダーでない場合、その上にあるフォールドヘッダーを探す 49 while line_number >= 0: 50 if self.text.GetFoldLevel(line_number) & wx.stc.STC_FOLDLEVELHEADERFLAG: 51 self.text.ToggleFold(line_number) 52 break 53 line_number -= 1 54 55if __name__ == '__main__': 56 app = wx.App() 57 editor = TextEditor(None, title="Text Editor") 58 editor.Show() 59 app.MainLoop()
試したこと
マージン2の幅やフォント、背景色などをいじりましたが意味がありませんでした。
補足情報(FW/ツールのバージョンなど)
Windows 11
Python 3.10.11
wxPython 4.2.0
0 コメント