やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PySDL2でTextEntryを表示する

sdl2.ext.UIFactory(sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)).from_color(sdl2.ext.TEXTENTRY, color=sdl2.ext.Color(0,0,0), size=(100,50))

成果物

GitHubPySDL2.GUI.TextEntry.201711211219

画像

開発環境

参考

PySDL2のUI

以下の3種類しかない。すべてsdl2.ext.Spriteの拡張らしい。

  • BUTTON
  • CHECKBUTTON
  • TEXTENTRY

GUIライブラリではないので期待しないほうが良さそう。

TEXTENTRY

TEXTENTRYは以下の問題点によりまったく使えない。これはひどい

  • そもそも文字列が表示されない
  • IMEが無効になり日本語変換できない

テキスト入力UIとしての最低限の機能すら満たせていない。それどころか、ラベルUIとしての役割すらできていない。これはGUIではない。

生成

  • sdl2.ext.UIFactory(sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)).from_color(sdl2.ext.TEXTENTRY, color=sdl2.ext.Color(0,0,0), size=(100,50))

イベント捕捉

def onInput(ui, event):
    print("Input: ", ui, event)
    print(event.text.text)
def onEditing(ui, event):
    print("Editing: ", ui, event)

entry = uifactory.from_color(sdl2.ext.TEXTENTRY, color=GREY, size=(300,50))
entry.input += onInput
entry.editing += onEditing
  • editingが発火しない
  • そもそもIMEが強制的に無効化されてしまう
    • タスクバーのIMEボタンをクリックしても無反応……

キー入力すると、そのキーのアルファベットが取得できる。全体のテキストは取得できない……。

Input:  SoftwareSprite(size=(300, 50), bpp=32) <sdl2.events.SDL_Event object at 0xb2877ecc>
b'k'
editing

参考文によると、IME入力変換に反応できるかのようなことが書いてある。

Text editing events are however only raised, if an IME system is involved, which combines glyphs and symbols to characters or word fragments.

どうすればいいのか不明……。コード例も無い。

所感

PyGameからPySDL2に移行したのは、日本語入力できるらしいと知ったからだった。しかし、無常にも不可能であるとの現実をつきつけられてしまった……。

情報はPyGameのときよりも激減するし、設計もダサい。もうPySDL2に触るのが嫌になってきた。