【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 を指定しているので、初動は半々での表示となる。
【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
【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()
結果は認証毎に標準出力される。
【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の日記
左側のテキストエリアに入力すると、右側にリアルタイム反映する。
【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()
【Ubuntu 14.10】PLANEX GW-USValue-EZ を使う【無線 LAN】
自宅の古い PC に入れている Lubuntu を 14.04 -> 14.10 にアップグレードした際、無線 LAN ドライバを再インストールをする必要があったので毎度調べるの面倒だしメモしておく。
PLANEX 11n/g/b対応 150Mbpsハイパワー無線LAN USBアダプタ GW-USValue-EZ [フラストレーションフリーパッケージ(FFP)]
- 出版社/メーカー: プラネックス
- 発売日: 2010/04/30
- メディア: Personal Computers
- 購入: 56人 クリック: 522回
- この商品を含むブログ (25件) を見る
まず、何が使われているかを調べる。
$ 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 で履歴から貼り付けとか)。
ただ、調べてみるとレジスタを用いればこの問題を解決出来るらしい。
@Phize 面倒くさいですが "* レジスタはあるんで,yankでもクリップボードに登録することはできます。あと, i_Ctrl-R + も使えます。|д゚)チラッ
— いまいまさのぶ (@masanobuimai) March 31, 2014
なるほど。
IdeaVim は 0.33 で map サポートしたし、.ideavimrc に書けば行けそう。
もしかして、もうやってる人居るのかな?と調べてみたら居ました。
System clipboard support in IdeaVim
これを .ideavimrc に書いたら無事クリップボードを利用できるようになった。
2yy とか y2y などは対応出来てはいないけど、そこはビジュアルモードで頑張ろう。