だらだら〜個人事業〜

HatenaDiaryから引っ越してきました。Githubもnyakagawanです。

vfilerにテキストコントロールを


まずvfiler作成の前に、python環境を整理した。
たぶんこの前macのシステムソフトウェアアップデートをやったときにpython環境がどうにかなってしまったような気がする。おかげでpythonの動作モードがデフォルト64bitになってしまって、wxpythonが動かなくなってしまっていた(wxpythonは32bit動作らしい)

インクリメンタルサーチのため

vfilerでインクリメンタルサーチしたいので、まず検索ワードを入力するためのテキストコントロールを置くことにした。ファイラー上部にListCtrl、下部にTextCtrlをおいて、それをSplitterWindowで分ける形にした。

FocusしたらListCtrlのScroll位置が勝手に変わる問題

ListCtrlが2つあるわけだが、このListCtrlにScrollbarが出ている状態(=Windowに中身が収まりきってない状態)でSetFocusされると(OnFocusが呼ばれると)Scroll位置が勝手に動いてしまう。
意味分からずググりまくると問題を解決しているサイトをみつけた
http://d.hatena.ne.jp/h1mesuke/20090429/p1
こちら。
この人はwxRubyらしいが、wxPythonだとこんな感じ

class ListCtrl( wx.ListCtrl ):
def __init__(self ...):
        self.Bind( wx.EVT_CHILD_FOCUS, self.OnChildFocus )
def OnChildFocus( self, event ):
        pass

wx.TextCtrl.EmulateKeyPressの効能とは?

例えばTextCtrlのKeyDownイベント内で、KeyDownされた時のテキストの内容を使って何か処理をしたい場合。

def OnKeyDown( self, event ):
  self.hoge( self.GetLineText(0) )
  self.Skip()

という感じになる。しかし、このときhoge()に渡るのはKeydownされた結果が反映される前のTextCtrlの内容になってしまう。そこでEmulateKeyPressを使う。

def OnKeyDown( self, event ):
  self.EmulateKeyPress( event )
  self.hoge( self.GetLineText(0) )
  #self.Skip()

これでhoge()にkeydownが反映された状態のテキストが渡る。
self.Skip()は呼んではいけない。二重にテキスト反映が行われる。
http://wxpython-users.1045709.n5.nabble.com/EmulateKeyPress-td2303506.html

memo

sizerのReplaceがうまくいかないところで終了