wxPythonでIME未確定文字列の表示
wx.lib.editor.Editorを試していて、問題が発生。
日本語を入力する時、未確定文字列がちゃんと表示されない!
カーソル位置ではなく、Editorの左上。
ひどい場合には全く表示されない。
調べてみると、他にもwxPythonでエディタを作っている人がいた。
GetHandleメソッドを使えば、FrameなりPanelなりのウィンドウハンドルを取得できる。
そして、そのハンドルをctypesを使ってWinAPIに送ればよい。
from ctypes import Structure, c_long, c_byte, c_wchar_p, c_ulong class POINT(ctypes.Structure): _fields_ = [ ("x", c_long), ("y", c_long), ] class COMPOSITIONFORM(Structure): _fields_ = [ ("dwStyle", c_ulong), ("ptCurrentPos", POINT), ("rcArea", RECT), ] hIMC = windll.imm32.ImmGetContext(self.GetHandle()) status = windll.imm32.ImmGetOpenStatus(hIMC) if not status: return windll.imm32.ImmReleaseContext(self.GetHandle(), hIMC) x =### 表示位置の指定 y = pt = POINT(x, y) cf = COMPOSITIONFORM() cf.dwStyle = 2 # CFS_POINT cf.ptCurrentPos = pt; windll.imm32.ImmSetCompositionWindow(hIMC, byref(cf)) windll.imm32.ImmReleaseContext(self.GetHandle(), hIMC)
これでIMEは使えるようになったが、Editorはそもそも日本語の入力を受け付けてくれない。
Editorをサブクラス化してオーバーライドするより、1から自分で作ったほうが速そうだ。