やってみる

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

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))

成果物

GitHubPySDL2.GUI.Button.201711210912

画像

開発環境

参考

PySDL2のUI

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

  • BUTTON
  • CHECKBUTTON
  • TEXTENTRY

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

問題

イベントハンドラに不足がある。

  • マウスポインタがUIの表示領域から出た時のイベントハンドラが無い
    • 実装方法に統一性をもたせることができない
      • 中途半端なイベント駆動型プログラミングになってしまう

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が流行らない理由がわかってきた。