やってみる

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

PySDL2でShapedWindow(透明、半透明、非矩形なウインドウ)

デスクトップマスコットなどを作るのに必要。WindowsAPIでいうLayeredWindowに該当するヤツ。

成果物

GitHub

PySDL2.ShapeWindow.Transparent.201711251053

開発環境

参考

1.py 2.py 4.py 5.py 5-2.py

概要

例によって情報がない。ひたすら検索し、コード例を適当にいじって、たまたまそれっぽくなった時点のコードを保存した。

効果

  • Windowの形を任意のマスク画像の形にできる
    • 背景透過
    • クリック透過

問題

  • 背景が再描画されない?
  • 背景の画像があきらかに壊れている(半透明箇所の背後)
  • 起動するたび、描画の結果がかわる
  • Windowを移動できない(タスクバーがないため)
    • Alt+F7キーでキーボードの方向キーによる移動ができた(背景透過を確認)

起動するたび、描画の結果がかわる

5.pyを実行した時、以下のように半透明になっていた。

5.py

しかし、しばらくして起動すると、以下のように半透明にならなくなっっていた。コードは変えていないのに。謎。

5-2.py

コードの実行順序で結果が変わる

最初は以下のようにしていた。真っ黒な画面が表示されるなど、失敗していた。

sdl2.SDL_SetWindowShape(window.window, circle_sf, shape_mode)
sdl2.SDL_SetWindowSize(window.window, circle.size[0], circle.size[1])

しかし、以下のようにコードの順序を逆にすると成功することがあった。謎。

sdl2.SDL_SetWindowSize(window.window, circle.size[0], circle.size[1])
sdl2.SDL_SetWindowShape(window.window, circle_sf, shape_mode)

所感

謎だらけ。挙動が不安定。とくに半透明の画像は怪しい。

クリック透過なWindowが作れることだけは確認できたので良しとする。