Kivy でアプリを作成-基礎とボタン配置【Python】

Kivy
スポンサーリンク

スポンサーリンク

はじめに

今回からは、Python の Kivy ライブラリを使用してKivyのチュートリアルを実施していきます。

Widget 系の説明は
Python Kivyの使い方① ~Kv Languageの基本~
上記サイトを参考にさせていただきました。

最終的には Kivy と Yolov8 を使用して画像認識アプリの完成を目指します。

前提条件

前提条件は以下の通りです。

  • Python がインストールされている
  • Windows11 (Ubuntuでも可?)

Kivy のインストール

kivy には pyenv が推奨されているので、先に pyenv をインストールします。

windows の場合

powershell で以下のコマンドを実行してください。こちらのgithubを参考にしました。

python -m pip install pyenv-win --target $HOME\\.pyenv

Ubuntu の場合

Ubuntu の場合は、bashrc に登録が必要になります。こちらのgithubを参考にしました。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install 3.10.6      #今回は3.10.6ですが、labelImgを動かすための変更が面倒な方は3.10以外で。
pyenv global 3.10.6

pyenv の有効化

pyenv がインストール出来たら、仮想環境を作成していきます。

mkdir kivy-dev
python -m venv venv310
source ./venv310/scripts/activate   #Linux
./venv310/Scripts/Activate.ps1      #Windows

これで準備は完了です。

Kivy のインストール

Kivy のインストール方法を説明します。今回はこちらの公式サイトを参考にしました。

python -m pip install "kivy[full]" kivy_examples

これで完了です。

Kivy の実行例

画面を表示してみる

test_1.py を作成して動かしてみます。

from kivy.app import App
from kivy.uix.widget import Widget

class MyWidget(Widget):
    pass


class MyApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyApp().run()

以下のように黒い画面が表示されます。

ボタンを表示する

画面にボタンを表示してみます。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class MyApp(App):
    def build(self):
        layout = BoxLayout(padding=10)
        button = Button(text='My first button')
        layout.add_widget(button)
        return layout


if __name__ == '__main__':
    MyApp().run()

上記を実行すると画面にでかいボタンが現れます。

BoxLayout の中に Button を埋め込んでいます。
レイアウトの詳細な説明はこちらの公式サイトにあります。

ボタンサイズ変更

ボタンサイズは、size_hint_x, size_hint_y で調整します。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class MyWidget(Widget):
    pass

class MyApp(App):
    def build(self):
        layout = BoxLayout(padding=10)
        button1 = Button(text='My first button', size_hint_y=0.2, size_hint_x=0.5)
        layout.add_widget(button1)
        return layout


if __name__ == '__main__':
    MyApp().run()

上記を実行すると、以下のようになります。

最下部にボタンが表示されました。

Kivy では座標原点が左下になる関係で、下部にボタンが表示されます。

ボタン位置変更

ボタン位置を変更するには、pos を使用します。
今回はボタンに直接適用させず、BoxLayout に適用します。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class MyWidget(Widget):
    pass

class MyApp(App):
    def build(self):
        layout = BoxLayout(padding=10, pos=(250,250))
        button1 = Button(text='My first button', 
                         size_hint_y=0.2, 
                         size_hint_x=0.5)
        layout.add_widget(button1)
        return layout

if __name__ == '__main__':
    MyApp().run()

上記を実行すると、以下のようになります。

初期画面サイズは 640×480 なので、おおよそ真ん中あたりに BoxLayout の左上の頂点がセットされました。

ボタンを増やす

ボタンを増やすには、BoxLayout に追加していくだけです。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class MyWidget(Widget):
    pass

class MyApp(App):
    def build(self):
        layout = BoxLayout(padding=10)
        button1 = Button(text='My first button', 
                         size_hint_y=0.2, 
                         size_hint_x=0.5)
        button2 = Button(text='My second button', size_hint_y=0.2)
        layout.add_widget(button1)
        layout.add_widget(button2)
        return layout

if __name__ == '__main__':
    MyApp().run()

上記を実行すると、以下のようになります。

ボタンを縦方向に配置

2個のボタンを水平方向ではなく、垂直方向に配置していきます。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class MyWidget(Widget):
    pass

class MyApp(App):
    def build(self):
        layout = BoxLayout(padding=10, orientation="vertical")
        button1 = Button(text='My first button', 
                         size_hint_y=0.2, 
                         size_hint_x=0.5)
        button2 = Button(text='My second button', size_hint_y=0.2)
        layout.add_widget(button1)
        layout.add_widget(button2)
        return layout

if __name__ == '__main__':
    MyApp().run()

上記を実行すると、以下のようになります。

縦方向に配置できました。

レイアウトを kv language で表記

VSCode に Kivy-Snippet をインストール しておいてください。

kivy では、今まで test_1.py に表記したレイアウトを kv language で表現できます。ファイル拡調子は .kv です。

まずは、test_2.py を作成します。

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

from kivy.lang.builder import Builder
Builder.load_file('test_2.kv')

class MyWidget(BoxLayout):
    pass

class MyApp(App):
    def build(self):
        return MyWidget()

if __name__ == '__main__':
    MyApp().run()

これだけです。
次に、test_2.kv を用意します。

<MyWidget>:
    orientation:'vertical'
    size_hint_y: 0.5
    size_hint_x: 0.5
    Button:
        text: 'my first button'
    Button:
        text: 'my second button'

以上です。
早速、実行してみてください。

おわりに

今回は BoxLayout 上でボタンを様々な方法で配置しました。

次回は FloatLayout を説明しつつ、他の Widget についても説明できればと思います。

コメント

タイトルとURLをコピーしました