Python

【Kivy入門】Button押下で動作するアプリの作り方【Python】

投稿日:

Kivyを使った簡単なGUIアプリケーションを作成します。
無理のない情報量で、適宜解説をしていますので、Kivyでアプリを作ってみようかな!と考えている方は、参考にしていただけると嬉しいです。
(Kivyに関しては触ったことなくても大丈夫ですが、Pythonに関しては、クラスや関数などの概念が理解できている前提の説明になりますので、ご了承ください。)

環境構築手順については、こちらで紹介しています。

完成像

今回作成するアプリは、こちらになります。

ボタンを押すことで、現在時間を取得することができます。

kvファイルでウィジェットを作成する

pythonファイルとkvファイルが必要ですが、まずはkvファイルを作成しましょう。

kvファイルの全体像はこちらになります。

#:kivy 1.11.1
<MainScreen>:
    BoxLayout:
        orientation: 'vertical'
        size: root.size

        Label:
            id: view_label
            text: '-'

        Button:
            text: 'Get Time'
            on_press: root.button_clicked()

MainScreen:

構成

まずは、全体の構成から入りましょう。

1行目の記載は、Kivy特有のもので、実行するKivyのバージョンを明記します。

2~13行目の記載は、MainScreenウィジェットの定義になります。
それぞれ、インデントと:で階層が分けられています。
MainScreenには子ウィジェットにBoxLayoutを設定しました。
また、BoxLayoutには、子ウィジェットとしてLabelウィジェットとButtonウィジェットを設定しました。
LabelウィジェットとButtonウィジェットの下には、ウィジェットではなく要素を記載しています。
ウィジェットごとに設定できる要素が異なります。この設定については後述します。

最後の15行目で、rootとするウィジェットを指定します。
今回は、MainScreenしかないので、rootウィジェットをMainScreenとします。

時刻表示用のラベルを配置する

Labelウィジェットについて説明します。

Labelは、単純に文字列を表示するために使われます。
今回のアプリでも、時間の表示をするために用意しました。

Labelには、”id”と”text”を指定しました。
idは、このLabelを識別できるように、固有のidを設定します。
textは、このLabelに表示するテキストを設定します。

Labelに表示するテキストを静的にするのであれば、このtextに直接文字列を与えてあげれば良いです。
しかし、今回のアプリのように、表示内容を動的にするのであれば、あくまでkvファイルで定義するtextは初期値であり、idを使ってpython側でLabelに表示する値を操作する使い方が適切です。

ボタンを配置する

Buttonウィジェットについて説明します。

Buttonウィジェットは、その名の通りボタンに使われるウィジェットです。
今回のアプリでは、時刻を取得・表示するトリガーとして使用するために用意しました。

Buttonには、”text”と”on_press”を指定しました。
textは、Label同様にButtonに表示する文字列を設定します。
on_pressは、ボタン押下時に発生するイベントを設定します。

textに関しては、Buttonは動的にする必要はないため、静的に設定しました。
(こちらも、idを使用すれば動的に変化させることも可能です。)

on_pressに関しては、python側のbutton_clicked関数を実行するように設定しました。
root.button_clickedというのは、rootウィジェットの(つまり、MainScreenウィジェットの)button_clickedということになります。

Python側でクラスを作成する

今度はPythonファイルを見てみましょう。

pythonファイルの全体像はこちらになります。

import datetime

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

class MainScreen(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def button_clicked(self):
        self.ids.view_label.text = str(datetime.datetime.now())
        
class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)
        self.title = 'Window Name'

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

構成

1行目は、時間を表示するためにimportしたもので、kivyとは関連しないpythonの一般的なモジュールです。

3,4行目は、kivyとWidgetクラスをimportしています。
必要なものだと、今はおまじないと思っていてください。

6~11行目は、MainScreenクラスの定義になります。
Widgetクラスを継承することで、widgetのさまざまな要素を参照することができます。(今回の例で言えば、Labelのid)
そして、MainScreenクラスの中で、kvファイルでも指定したbutton_clicked関数も定義しています。

13~16行目は、TestAppクラスの定義になります。
これも、今はおまじないで良いと思います。
一つ注意点としては、参照するkvファイルのファイル名と、このAppクラスの名前を一致させないと動作しないことに注意してください。

18,19行目は、main関数の実行をしています。
pythonの一般的な記述になりますので、説明は省略します。

ボタン動作時にLabelのテキストを変更する

10行目で、button_clicked関数の定義をしました。

このbutton_clicked関数は、kvファイルにも定義がされております。
このような記載をすることで、ボタンが押下時のトリガーで実行することができます。

また、self.ids.view_label.text は、idがview_labelウィジェットのtext要素を参照するものになります。

したがって、10,11行目を定義して、kvファイルでbuttonウィジェットのon_pressに同名の関数を定義することで、ボタン押下時のイベント処理が作成できます。

実行したい関数を変えたい場合は、pythonファイルには新しい関数の定義をし、kvファイルにはon_pressの定義をその新しい関数に変えることでも実行できます。

まとめ

今回は、ボタン押下で時刻を表示する簡単なアプリの作成をしました。
pythonファイルとkvファイルの紐付け方について学習しました。

LabelやButtonを増やしてみたり、フォントサイズの変更などをやってみると理解が深まると思います。

ここまで読んでいただき、ありがとうございました。

-Python
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】グローバル変数が更新されない時の対処法

Pythonでグローバル変数を取り扱っているとき、関数内でグローバル変数の値を更新しても、更新が反映されていないということはないでしょうか。 これには、Pythonのお作法が関わっています。この解決法 …

【Python】GUIライブラリの比較【Tkinter, PyQt, Kivy】

Python言語は、機械学習やサーバーサイドのイメージが強いと思うのですが、実はGUIアプリケーションを作成することも可能です。 今回は、Pythonで代表的なGUIツール4つを比較してみました。 目 …

【Kivy】ボタンのフィードバックと重い処理を分ける方法【Python】

Kivyでアプリ開発をしていると、MVCのように処理と表示を分けたくなることがあると思います。その時、ボタンをトリガーにすると、ボタンのフィードバックのタイミングが処理の終了タイミングと同じになってし …

【Kivy】AttributeError: ‘ROOT’ object has no attribute ‘_disabled_count’の対処法【Python】

Kivyでのアプリ開発をしていると、このようなエラーに出くわすことがあります。こちらのエラー対処法を紹介します。 目次1 結論:Widgetを定義したクラスのコンストラクタを修正2 補足2.1 発生条 …

【Kivy】Widgetの初期値をidで指定する方法【Python】

Kivyを使ったアプリ開発をやっていると、widgetの初期値について、kvファイルで指定するのではなくpythonファイルで設定したくなることがあると思います。そんな時、root widgetクラス …

yassanさんのプロフィール写真

yassan
R&Dエンジニア。
新卒で大手の社内SEになったもののスキルアップのためにITベンダーに転職。
技術調査からプログラミングまで幅広くやってます。
趣味はバイクとガジェットと遊戯王カードです。