2noの日記

メモ用

【wxPython】Markdown をライブプレビュー

Markdown パッケージを次を参考にインストール
Installation — Python Markdown

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

import wxversion
wxversion.select("3.0")
import wx
import wx.html2
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")
    sizer = wx.BoxSizer(wx.HORIZONTAL)
    text  = wx.TextCtrl(frame, -1, "", style=wx.TE_MULTILINE)
    text.Bind(wx.EVT_CHAR, update)
    browser = wx.html2.WebView.New(frame)
    sizer.Add(text, 1, wx.EXPAND, 10)
    sizer.Add(browser, 1, wx.EXPAND, 10)
    frame.SetSizer(sizer)
    frame.SetSize((640, 480))
    timer = wx.Timer(frame)
    frame.Bind(wx.EVT_TIMER, update_preview, timer)
    frame.Show()
    app.MainLoop()

WebView を使うので wxPython のバージョンを 3 に指定。
EVT_CHAR (入力)時に即プレビューしたいところだが、最後に入力した内容が反映されない。
EVT_TIMER で少し間を空けてから反映しているところがミソ。


追記: 2014/11/19 20:19
ミソと書いておきながら、EVT_CHAR とか EVT_TIMER なんて使う必要なかった件
【wxPython】TextCtrl と StyledTextCtrl の change イベントの違い - 2noの日記


左側のテキストエリアに入力すると、右側にリアルタイム反映する。

f:id:wakuworks:20141117210806p:plain