PySDL2でShapedWindow(透明、半透明、非矩形なウインドウ)
デスクトップマスコットなどを作るのに必要。WindowsAPIでいうLayeredWindowに該当するヤツ。
成果物
PySDL2.ShapeWindow.Transparent.201711251053
開発環境
- Linux Mint 17.3 MATE 32bit
- SDL2 2.0.2
- pyenv 1.0.10
参考
- https://bitbucket.org/marcusva/py-sdl2/issues/27/shape-window-not-showing-on-desktop
- https://qiita.com/nak2yoshi/items/1411fbb65ccf82545e65
- http://temama.hatenablog.com/entry/2016/05/07/104938
概要
例によって情報がない。ひたすら検索し、コード例を適当にいじって、たまたまそれっぽくなった時点のコードを保存した。
効果
- Windowの形を任意のマスク画像の形にできる
- 背景透過
- クリック透過
問題
- 背景が再描画されない?
- 背景の画像があきらかに壊れている(半透明箇所の背後)
- 起動するたび、描画の結果がかわる
- Windowを移動できない(タスクバーがないため)
Alt
+F7
キーでキーボードの方向キーによる移動ができた(背景透過を確認)
謎
起動するたび、描画の結果がかわる
5.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が作れることだけは確認できたので良しとする。