質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

687閲覧

wxPythonでインデント階層の折りたたみが実装できない。

takoyaki280

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

2クリップ

投稿2023/04/17 09:40

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fold アイコン等は、MarkerDefine メソッドで自分で設定する必要があります。

詳しくは、demo のコードと見比べ、他のパラメーター設定も見直してみてください。
https://github.com/wxWidgets/Phoenix/blob/master/demo/StyledTextCtrl_2.py

diff

1- self.text.SetFoldFlags(wx.stc.STC_FOLDFLAG_LINEBEFORE_CONTRACTED | wx.stc.STC_FOLDFLAG_LINEAFTER_CONTRACTED) 2+ self.text.SetProperty("fold", "1") 3 4 5# + MarkerDefine で7種類のアイコンを設定

投稿2023/04/18 04:40

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問