2noの日記

メモ用

【wxPython】分割可変ウィンドウ

ウィンドウを分割しつつ、可変にするなら SplitterWindow を使う。

# -*- coding: utf-8 -*-

import wxversion
wxversion.select("3.0")
import wx
import wx.html2
import wx.stc as stc
import markdown

def update(event):
    timer.Start(milliseconds=100, oneShot=True)
    event.Skip()

def update_preview(event):
    browser.SetPage(convert_by_str(text.GetValue()), "")
    event.Skip()

def convert_by_str(str):
    codehilite = "codehilite(force_linenos=True, guess_lang=False, css_class=syntax)"
    html = markdown.markdown(str, ["extra", codehilite])
    return html

if __name__ == "__main__":
    app   = wx.App()
    frame = wx.Frame(None, wx.ID_ANY, "Markdown test", size=(800, 600))
    sw    = wx.SplitterWindow(frame, -1, style=wx.SP_LIVE_UPDATE)
    pane1 = wx.Panel(sw, -1)

    text = stc.StyledTextCtrl(pane1, wx.ID_ANY)
    text.SetMarginType(1, stc.STC_MARGIN_NUMBER)
    text.SetMarginWidth(1, 30)
    text.StyleSetSpec(stc.STC_STYLE_LINENUMBER, "fore:#999999")
    text.Bind(wx.EVT_CHAR, update)

    pane1_sizer = wx.BoxSizer()
    pane1_sizer.Add(text, 1, wx.EXPAND, 10)
    pane1.SetSizer(pane1_sizer)

    pane2 = wx.Panel(sw, -1)
    browser = wx.html2.WebView.New(pane2)

    pane2_sizer = wx.BoxSizer()
    pane2_sizer.Add(browser, 1, wx.EXPAND, 10)
    pane2.SetSizer(pane2_sizer)

    sw.SetSashGravity(0.5)
    sw.SplitVertically(pane1, pane2)

    timer = wx.Timer(frame)
    frame.Bind(wx.EVT_TIMER, update_preview, timer)

    frame.Show()
    app.MainLoop()

分割した時の割合は、SetSashGravity で定める。今回は 0.5 を指定しているので、初動は半々での表示となる。

f:id:wakuworks:20141118225833p:plain