Kivyで非矩形ウィンドウ


kivyで非矩形ウィンドウを作る方法についての記事です。
ちなみにこの記事の内容は開成学園コンピューター部の文化祭にて僕が書いた部誌とほぼ同じ内容です。
pdfになってるのでそちらが良ければここでダウンロードできます。

画像の用意

まずはウィンドウの形を決める画像を用意します。ここで気を付けてほしいのは、「透過情報を持たせた画像を用意する」ということです。Windows10で標準搭載されているペイント3Dなんかを使えば結構簡単にできます。

僕はこんな感じの画像を用意しました。

プログラムを書く

プログラムを書いていきます。

from kivy.config import Config
Config.set('graphics','shaped',1)
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.clock import Clock
import PIL


Window.fullscreen = False
Window.borderless = True
img_path = './HEBIKUNN.png'
img = PIL.Image.open(img_path)

class Test(App):
    def build(self):
        global img
        Window.size = img.size
        Clock.schedule_once(self.set)
        snake = BoxLayout()
        snake.add_widget(Button(text='1',on_press=lambda _: self.stop()))
        snake.add_widget(Button(text='2'))
        return snake
    def set(self,dt):
        global img_path
        Window.shape_image = img_path
        Window.shape_mode = 'binalpha'

Test().run()

とりあえず実行してみましょう。

↑こんな感じになったら成功です。
ちゃんと非矩形ウィンドウになってますね。

手順としては
1. 透過情報をもった画像を用意する
2. buildメソッドでWindow.sizeを画像のサイズにする
3. shape_image,shape_modeをそれぞれ画像のパス、'binalpha'に設定する(非矩形ウィンドウにする為の設定です)
ということをするだけで簡単にできてしまいます。

難点

たしかにこの方法だと簡単に非矩形ウィンドウが作れるのですが、一つ気を付けないといけないことがあります。
それは、「処理が無茶苦茶重い」ということです。当たり前ですが矩形ウィンドウに比べると凄く重いです。
ですから実用的にはちょっと厳しいと思います。でもまぁ結構面白いこと(ディスプレイ上キャラクターが動くゲームを作ったりとか)ができたりするので、ぜひ遊んでみてください。