PySDL2でButtonを表示する
sdl2.ext.UIFactory(sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)).from_color(sdl2.ext.BUTTON, color=sdl2.ext.Color(0,0,0), size=(100,50))
成果物
PySDL2.GUI.Button.201711210912
開発環境
- Linux Mint 17.3 MATE 32bit
- SDL2 2.0.2
- pyenv 1.0.10
参考
PySDL2のUI
以下の3種類しかない。すべてsdl2.ext.Sprite
の拡張らしい。
- BUTTON
- CHECKBUTTON
- TEXTENTRY
GUIライブラリではないので期待しないほうが良さそう。
問題
イベントハンドラに不足がある。
C#, Javaなどの一般的な言語では、Enter, Leave, のようなイベントハンドラが用意されているのに……。
Buttonの全イベントハンドラ
- motion
- pressed
- released
- click
motionイベントハンドラの謎
- なぜButtonにEnterイベントハンドラがある?(click系だけで十分では?)
- なぜEnterは用意したのにLeaveがない?(EnterだけではON/OFF切換できない)
対策
Leave時のみ、メインループ内でif文による実装をする。
while running: events = sdl2.ext.get_events() for event in events: if button.state != sdl2.ext.HOVERED: sdl2.ext.fill(button.surface, GREY)
click
などの
def onClick(button, event): print('Click!!') button = uifactory.from_color(sdl2.ext.BUTTON, color=button_color, size=(100,50)) button.click += onClick
所感
PySDL2の設計はかなり酷くないか? sdl2.ext.World然り、イベントハンドラ然り。
PySDL2が流行らない理由がわかってきた。