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

【wxPython】テキストエリアに行数を表示

StyledTextCtrl を使えば簡単に実装出来る。
試しに以前作った 『Markdown をライブプレビュー』に加えてみる。
【wxPython】Markdown をライブプレビュー - 2noの日記

# -*- 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")
    sizer = wx.BoxSizer(wx.HORIZONTAL)

    text  = stc.StyledTextCtrl(frame, 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)

    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()

行数を表示するには、StyledTextCtrl を使い、text.SetMarginType(1, stc.STC_MARGIN_NUMBER) を実行する必要がある。
この情報が少なくて結構探しまわった。
【参考】wx.stc.StyledTextCtrl 增加行号 - Python||C - 博客频道 - CSDN.NET

f:id:wakuworks:20141118121316p:plain

【wxPython】Qiita API(v1) でログインを試みる

本当は v2 の OAuth 認証を使いたいのだけど。

ここで使っている requests はこちら
http://docs.python-requests.org/en/latest/

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

import wxversion
wxversion.select("3.0")
import wx
import requests

def submit_handler(event):
    authorize(tc_name.GetValue(), tc_pass.GetValue())

def authorize(url_name, password):
    data   = { 'url_name': url_name, 'password': password }
    result = requests.post("https://qiita.com/api/v1/auth", data=data)
    print(result.text)

if __name__ == "__main__":
    app = wx.App()
    frame = wx.Frame(None, wx.ID_ANY, u"認証テスト")
    panel = wx.Panel(frame, wx.ID_ANY)
    sizer = wx.FlexGridSizer(rows=3, cols=2, hgap=15, vgap=0)

    st_name = wx.StaticText(panel, -1, u"ユーザ名")
    sizer.Add(st_name, flag=wx.ALL|wx.ALIGN_CENTRE_VERTICAL, border=5)
    tc_name = wx.TextCtrl(panel, wx.ID_ANY)
    sizer.Add(tc_name, flag=wx.ALL, border=5)

    st_pass = wx.StaticText(panel, -1, u"パスワード")
    sizer.Add(st_pass, flag=wx.ALL|wx.ALIGN_CENTRE_VERTICAL, border=5)
    tc_pass = wx.TextCtrl(panel, wx.ID_ANY, "", style=wx.TE_PASSWORD|wx.EXPAND)
    sizer.Add(tc_pass, flag=wx.ALL, border=5)

    sizer.Add((20, 20)) # スペース

    btn_submit = wx.Button(panel, wx.ID_ANY, u"認証")
    btn_submit.Bind(wx.EVT_BUTTON, submit_handler)
    sizer.Add(btn_submit, flag=wx.ALL, border=5)

    panel.SetSizer(sizer)
    panel.Fit()
    frame.Fit()

    frame.Show()
    app.MainLoop()

結果は認証毎に標準出力される。

f:id:wakuworks:20141118025103p:plain

【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

【wxPython】setTimeout みたいなこと

750ms 後、ウィンドウに Done! と表示する

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

import wx

def timer_test(event):
    text.SetLabel("Done!")

if __name__ == "__main__":
    app = wx.App()
    frame = wx.Frame(None, wx.ID_ANY, "Timer test", size=(300, 200))
    panel = wx.Panel(frame, wx.ID_ANY)
    text  = wx.StaticText(panel, wx.ID_ANY, "")
    timer = wx.Timer(frame)
    frame.Bind(wx.EVT_TIMER, timer_test, timer)
    timer.Start(milliseconds=750, oneShot=True)
    frame.Show()
    app.MainLoop()

f:id:wakuworks:20141117204004p:plain

【Ubuntu 14.10】PLANEX GW-USValue-EZ を使う【無線 LAN】

自宅の古い PC に入れている Lubuntu を 14.04 -> 14.10 にアップグレードした際、無線 LAN ドライバを再インストールをする必要があったので毎度調べるの面倒だしメモしておく。

まず、何が使われているかを調べる。

$ lsusb
Bus 002 Device 003: ID 2019:ed17 PLANEX GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]

ここから Realtek RTL8188CUS が使われている事が分かったので、Realtek のサイトからドライバを落としてくる訳だが、2014/11/14現在、公開されているドライバ(ver4.0.2_9000)は、カーネルの問題で 13.10 以降ではインストールに失敗する(一年以上経っているが、ドライバは更新されていない)。

そこで、rtl8192cu-fixes を利用する。

pvaret/rtl8192cu-fixes · GitHub

インストール方法は、README に載っている通り。
まずはインストールする上で必要なパッケージをインストールする。

$ sudo apt-get install linux-headers-generic build-essential dkms

リポジトリのクローン、または git を入れていなければダウンロードでも良い。

$ git clone https://github.com/pvaret/rtl8192cu-fixes.git

dkms のモジュールとしてソースを追加。

$ sudo dkms add ./rtl8192cu-fixes

追加したモジュールをビルドし、インストール。

$ sudo dkms install 8192cu/1.9

モジュールリストを更新。

$ sudo depmod -a

あと、ブラックリストに登録をしておく。

$ sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/

全部終わったら再起動。

これによって接続が安定した。

IdeaVim からクリップボードを利用する

追記: 2014-12-03 03:23

バージョンが 0.38 に上がり、set clipboard が使用出来るようになった。レジスタとマップで頑張る必要もなくなった。

追記: 2014-11-13 23:39

バージョン 0.38 で clipboard オプション使えるようになるんですって。。


Windows で作業するようになってから、PhpStorm や IntelliJ で作業をしている。

もっぱら IdeaVim でコーディングしているのだが、通常の Vim と違って clipboard オプションが無く、コピーやペーストに四苦八苦していた(コピーする時は選択した後に Edit -> Copy とか、貼り付ける時は Ctrl+Shift+V で履歴から貼り付けとか)。

ただ、調べてみるとレジスタを用いればこの問題を解決出来るらしい。

なるほど。
IdeaVim は 0.33 で map サポートしたし、.ideavimrc に書けば行けそう。
もしかして、もうやってる人居るのかな?と調べてみたら居ました。

System clipboard support in IdeaVim

これを .ideavimrc に書いたら無事クリップボードを利用できるようになった。
2yy とか y2y などは対応出来てはいないけど、そこはビジュアルモードで頑張ろう。