Kivyアプリケーションのウィンドウサイズの設定やタイトルの設定などよく使われそうなウィンドウ関連の設定方法とWindowクラスのイベントを使ったサンプルを紹介します。
画面設定
Kivyではアプリケーション画面は1つのみ作成することを推奨しています。アプリケーション画面の中で画面表示を切り替えたり、ポップアップウィンドウを表示したりすることができるので1つでも大丈夫です。
ウィンドウサイズやタイトルなどの設定をするにはWindowクラスかAppクラスを使います。
kivy.core.window
kivy.app
以下によく使われる設定を示します。
from kivy.core.window import Window
from kivy.app import App
# ウィンドウのサイズ設定
#Window.size = (500, 500)
Window.system_size = (500, 500)
# ウィンドウの最小サイズを設定
Window.minimum_width = 300
Window.minimum_height = 300
# Windowクラスでアイコンを設定
# Window.set_icon('./icons/test-icon001.png')
# フルスクリーンモードに設定
#Window.fullscreen = True
# ウィンドウを最大化した状態で起動する
# Window.maximize()
# 背景色を設定
Window.clearcolor = (0, 0, 1, 1) # 青 (R, G, B, A)
# ウィンドウの位置を設定
Window.left = 100
Window.top = 50
class WindowSettings1(App):
def build(self):
# アプリケーションタイトルを設定
self.title = 'TestTitle'
# Appクラスでアイコンを設定
self.icon = './icons/test-icon002.ico'
return None
if __name__ == '__main__':
WindowSettings1().run()
ウィンドウのサイズ設定を設定する
起動した時のウィンドウのサイズを設定します。サイズを変更するにはsizeメソッドとsystem_sizeメソッドの2つがあります。Window.minimum_widthとWindow.minimum_heightのサイズより小さい値を設定するとこのサイズが適用されます。このサイズより小さい値を設定しないことをお勧めします。
sizeメソッド
論理サイズで計算されます。幅と高さを指定します。
# ウィンドウのサイズ設定 (幅, 高さ)
Window.size = (800, 600)
system_sizeメソッド
物理サイズで計算されます。幅と高さを指定します。
# ウィンドウのサイズ設定 (幅, 高さ)
Window.system_size = (300, 300)
Window.sizeとWindow.system_sizeの違い
Window.sizeは論理サイズ(スケールされた値)を取得していてWindow.system_sizeは実際の物理サイズ(ピクセル単位の値)を取得していてそれぞれ数値が異なります。
- Window.size:論理サイズ
- Window.system_size:物理サイズ
例えばKivyの論理サイズの300は物理サイズで525になります。これを確認するサンプルコードをこの記事の最後の章で紹介しています。
論理サイズ(logical size)
DPI(ドット密度)に基づいてスケーリング(ディスプレイで視覚的サイズを拡大処理する機能)された値です。Kivyの内部では論理サイズを使用して描画を行います。
物理サイズ(physical size)
実際にウィンドウが描画されるピクセル単位のサイズでディスプレイに表示されるサイズです。
タイトルバーのタイトルを設定する
ウィンドウのタイトルバーのタイトルを設定します。このメソッドはWindowクラスに用意されていますが、これは機能しませんでした。
# これは機能しない
Window.set_title('TestTitle')
代わりにAppクラスのtitleメソッドを使います。build()内で定義すると良いと思います。
self.title = 'TestTitle'
タイトルバーのアイコンを設定する
ウィンドウのタイトルバーにアイコンを設定するには、Windowクラスで設定する方法とAppクラスで設定する方法の2つがあります。
Windowクラスで設定する
画像ファイルのパスを指定します。拡張子まで入力してください。
Window.set_icon('./icons/test-icon001.png')
Appクラスで設定する
同様に画像ファイルのパスを指定します。
self.icon = './icons/test-icon006.ico'
使用できるファイル形式と最適なサイズ
画像ファイル形式はKivyがサポートしている画像形式が使えます。
- PNG
- JPEG
- GIF
- BMP
- ICO
- SVG
最適な画像サイズは公式サイトでは下記の記載があります。古い情報なので不確かですが1:1にしておけば間違いなさそうです。上記の画像形式で1024x1024で試してみましたが特に問題ありませんでした。(アイコンにしてはこれは大きすぎます。おそらく256x256でも十分な大きさです)
GNU/LinuxおよびMac OSXの場合は256×256または1024×1024が推奨されます。Windows 7の場合は32×32以下。Windows8の場合は256×256以下。少なくともWindows8では256×256でも動作しますが、サイズが縮小されて32×32アイコンほど見栄えがよくありません。
ウィンドウの最小サイズを設定する
ウィンドウの最小サイズを設定するには下記のようにします。単位はおそらく物理サイズ(ピクセル)だと思われます。
# ウィンドウの幅を設定
Window.minimum_height = 600
# ウィンドウの高さを設定
Window.minimum_width = 500
minimum_heightとminimum_widthは両方設定しないと機能しないので注意してください。
ウィンドウを最大化した状態で起動する
ウィンドウサイズを最大化した状態で起動します。
Window.maximize()
これを定義した場合Window.sizeは定義しない方がいいかもしれません。(特にエラーにはなりません)
フルスクリーンモードで起動する
全画面の状態で起動します。True、False、autoが指定可能です。
Window.fullscreen = True
ウィンドウの位置を設定する
起動した時に指定のOSの座標位置にウィンドウが置かれるようにします。指定した座標にアプリケーション画面の左上の角がくるように配置されます。OSの画面左上の座標が[x(水平軸):0、y(垂直軸):0]になります。
Window.left = 100 # x座標
Window.top = 50 # y座標
画面の色を設定する
画面の背景色を設定します。画面をウィジェットで埋めた場合この設定は意味をなさいので注意してください。色はRGBAで指定します。ここで透明度は機能しません。
Window.clearcolor = (0, 0, 1, 1) # 青 (R, G, B, A)
RGBAについては下記のページで説明しています
ウィンドウのリサイズを制御する
ウィンドウサイズを変更できるメソッドは見つかりませんでした。Config.iniに「resizable」の設定があるのでConfig.setで設定してみましたが機能しませんでした。
しかし、画面の縮小を制御することは可能です。下記のようにminimum_widthとminimum_heightをウィンドウサイズと同じ値にすることで縮小できなくなります。ただし、ユーザーがこのサイズより大きくすることは可能です。
# ウィンドウのサイズ設定
Window.size = (1000, 600)
# ウィンドウの最小サイズを設定
Window.minimum_width = 1000
Window.minimum_height = 600
Windowクラスのイベントを使う
Windowクラスではウィンドウを制御する多くのイベントがあります。下記にその一部を列挙します。
- on_key_down:キーボードのキーが押された時に発生するイベント
- on_key_up:キーボードのキーが離された時に発生するイベント
- on_rotate:画面が回転した時に発生するイベント
- on_close:画面が閉じられた時に発生するイベント
- on_cursor_enter:画面内にカーソルが当たると発生するイベント
- on_cursor_leave:カーソルが画面の外側に出ると発生するイベント
- on_minimize:画面が最小化されると発生するイベんンと
- on_maximize:画面が最大化されると発生するイベント
- on_restore:画面が最小化された後に画面をアクティブにしたときに発生するイベント
- on_hide:画面が非表示になった時に発生するイベント
- on_show:画面が表示された時に発生するイベント
- on_keyboard:入力時にキーボードを使用した時に発生するイベント
- on_key_down:キーボードのキーが押された時に発生するイベント
- on_key_up:キーボードのキーが押されて離れたときに発生するイベント
- on_drop_begin:画面内にテキストまたはファイルのドロップが開始される直前に発生するイベント
- on_drop_file:画面内にファイルがドロップされたときに発生するイベント
- on_drop_text:画面内にテキストがドロップされたときに発生するイベント
- on_drop_end:画面内にテキストまたはファイルのドロップが終了した時に発生するイベント
- on_textedit:IMEで入力したときに発生するイベント
on_resizeを使用してWindow.sizeとWindow.system_sizeを表示する
Windowクラスのイベントのon_resizeイベントを使用してWindow.sizeとWindow.system_sizeを確認するサンプルコードになります。
on_resizeイベントはウィンドウのサイズ変更が行われると発生するイベントです。
window_event1.py
from kivy.app import App
from kivy.core.window import Window
Window.system_size = (300,300)
class WindowEvent1(App):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# on_resizeイベントをバインド
Window.bind(on_resize=self.on_resize)
def on_resize(self, instance, width, height):
physical_size = Window.system_size
self.root.ids.label.text = (
f"Window resized to:\n"
f"Logical size: {width} x {height}\n"
f"Physical size: {physical_size}"
)
if __name__ == "__main__":
WindowEvent1().run()
windowevent1.kv
BoxLayout:
orientation: 'vertical'
Label:
id: label
text: ''
このコードはウィンドウのサイズを変更すると「Logical size」と「Physical size」を取得し文字列を変更します。
コード解説
Window.system_size = (300,300)
起動した時の画面サイズを物理サイズで定義しています
BoxLayout:
kvファイルではルート要素にBoxLayoutのウィジェットを指定しています。これがルートウィジェットになります。
# on_resizeイベントをバインド
Window.bind(on_resize=self.on_resize)
bindメソッドでon_resizeイベントにオーバーライドしたon_resizeメソッドを紐づけしています。
# バインドの書き方
Window.bind(event_name=callback_function)
event_name
: イベントの名前。この場合は、on_resize
。callback_function
: イベントが発生したときに実行する関数。この例ではself.on_resize
。
on_resizeイベントが発生するとon_resizeメソッドが呼ばれます。
def on_resize(self, instance, width, height):
on_resizeメソッドをオーバーライドしています。引数には(instance, width, height)を指定します。
instance
: イベントを発生させたオブジェクト(ここではWindow
になります)width
: 新しいウィンドウの幅が取得されます。height
: 新しいウィンドウの高さが取得されます。
on_resizeメソッドで取れる幅と高さは論理サイズでした。
Comment