1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【学習記録】Python&kivyでアプリを開発②【初動編】

Last updated at Posted at 2025-11-01

はじめに

お疲れ様でございます。ハム二郎です:bow_tone1:

前回の記事では、Python × Kivy を使ったアプリ開発の背景と構想を紹介しました。
今回はその続編として、実際の環境構築と学習過程をまとめます。

PythonやKivyの導入で躓いた点や、試行錯誤を通して学んだことを整理しました。
同じように学び始めた方の参考になれば幸いです。


:mag_right: この記事で得られること

この記事を読むと以下のような知識が得られます。

  • Python × Kivy の開発環境構築手順
  • 仮想環境(venv)の目的と構築手順
  • Kivy導入時の注意点とエラー対応
  • VSCodeで快適に開発を進めるための設定

目次

概要

:bulb: Pythonとは

インタプリタ型のプログラミング言語。「モジュール」を組み合わせることで、自由に機能を拡張できる。

インタプリタ… プログラムを1行ずつ読みながら即座に実行する仕組み。つまり、人間が読み書きしやすく設計された、科学計算・AI・Web・GUIなど、あらゆる分野で活用できる万能言語。

モジュール… Pythonの機能をまとめた“部品(ファイル)”。プログラムを整理して再利用しやすくするための「箱」や「道具箱」の役割。

Pythonには「The Zen of Python(禅)」という設計哲学があり、他の言語と比較して非常に読みやすくされている。実際にターミナルで「import this」と打つと設計思想が出てくる。非常にかっこいい。

名前の由来はイギリスのコメディ番組「Monty Python’s Flying Circus」。Python開発者の Guido van Rossum(グイド・ヴァン・ロッサム) がこの番組のファンだったためPythonと名付けられた。

:bulb: kivyとは

Pythonでアプリを作るための外部モジュール(ライブラリ)

:arrow_right: Python本体(=インタプリタ)は最小限の機能しか持っていないため 、Pythonを「アプリ制作ができる言語」に拡張している。

本来、アプリを作るには

  • iOS:Swift
  • Android:Kotlin

といった専用言語が必要だが、Kivyを使えばPythonだけでクロスプラットフォーム開発が可能となる。

:bulb:PythonとkivyでiOSアプリ開発

KivyでiOSアプリを実際に「iPhoneで動かす」には、Appleの仕組みに従う必要があるため、現実的にはWindowsで学習 → Macでビルド、という2段階構成となる。
以下にiOSアプリ開発までの流れをまとめる。

手順 内容
:arrow_left:現状 WindowsでKivyアプリを開発・学習する(UIやロジック作り)
Python + Kivy を使ってアプリの画面や動作を作成し、VS Codeなどで実行・確認する。
Macを用意(自分のMac or クラウドMac)
iOSビルドにはMac環境が必須。自分のMacを使用するか、MacStadiumやMacinCloudなどのクラウドMacを利用する。
MacにXcodeとPython/Kivyを入れてビルド環境を構築
brewやpipを使って必要なツールを導入し、kivy-iosでiOS向けプロジェクトを生成する。
iPhone実機やシミュレーターで動作確認
Xcodeでプロジェクトを開き、シミュレーターまたは実機にアプリをインストールして動作テストを行う。
Apple Developer登録でApp Store申請可能に
Apple Developer Programに登録(年¥13,800)し、XcodeからアプリをApp Storeに申請・公開できるようにする。

:bulb: Vscodeとは

VSCode(Visual Studio Code)… プログラミングを書くための高性能なテキストエディタ(開発環境)

つまり、VSCodeは「Pythonを動かすソフト」ではなく、Pythonを使うには以下の作業が必要となる。
:one: Python本体(インタプリタ)をインストールする。
:two: VSCodeでPythonの「拡張機能」を入れる。
:three: VSCodeからPythonを呼び出して実行。

仮想環境

1. 定義

プロジェクトごとに独立したPythonの作業空間を作る仕組み

➡️ 他のプロジェクトに影響を与えずにライブラリを管理し、ライブラリの衝突を防ぐ

:warning: 仮想環境がない場合に起きること

① すべてのライブラリが「共通の場所」に入る
仮想環境を作らない場合、pip install kivy のようにライブラリを入れると、グローバル環境(PC全体のPythonフォルダ)に保存される。これにより、他のプロジェクトも同じライブラリを共有してしまう。

② プロジェクトごとのバージョン違いが扱えなくなる
仮想環境無しの場合、異なるバージョンを同じ場所で使うため後からインストールしたバージョンが上書きされる。
例:
プロジェクトA → requests==2.28 が必要
プロジェクトB → requests==2.31 が必要

➡どちらも同じPCにあると、pip install後に入れた方が上書きされてしまう。

結果:

  • Aを動かすと「古いバージョンがない」とエラー
  • Bを動かすと「新しいバージョンが合わない」とエラー

だからこそ、Python開発の基本は「仮想環境(venv)を使う」ことにある。

2. 構築手順

私はwindows11でVscodeを使用して構築したため、その流れをまとめます。

:one: エクスプローラー(ファイル管理ツール)にて、プロジェクト用のフォルダを作成。私は練習用として「python-practice」というフォルダを作成しました。

フォルダ … ファイルを整理・収納する「入れ物(箱)」。なお、他のフォルダを入れることもできる(=入れ子構造)。
ファイル … 実際にデータ(内容)が入っている「中身」。

:two: VSCodeを起動し、上記で作成したフォルダを開く。

:three: VSCode内下部のターミナル(PowerShell)にて、Pythonで仮想環境(virtual environment) を作成するためのコマンドpython -m venv kivyenvを入力。なお、これで動かない場合、Pythonがインストールされていない・環境変数に登録されていない可能性がある。その場合はpy -m venv kivyenvを入力。

:bulb: python … Python本体を実行するコマンド。
:bulb: -m venv … venvというモジュールを実行するという意味。「venv」は仮想環境を作成するための標準モジュール
:bulb: kivyenv … 作成する仮想環境のフォルダ名(環境名)

➡️ これにより、「kivyenv」というフォルダが作られる。これが仮想環境。

:four: kivyenv\Scripts\activateを入力し実行することにより、仮想環境を有効化できるが以下の通り注意が必要。

:bulb: Scripts … 仮想環境の中にある「実行用スクリプト」を集めたフォルダ。
:bulb: activate … 仮想環境を「有効化」するためのスクリプト(プログラム)。

:mag_right: コードとスクリプトの違い

  • コード = すべてのプログラム
  • スクリプト = 作業を自動化するための便利なコード

:no_entry_sign: Windowsの場合はWindows特有の制限(実行ポリシー) に引っかかり、スクリプトの実行が禁止(Restricted) される。よって、制限緩和のスクリプトを実行する必要がある。
しかし、毎回入力し実行するのは面倒なため、制限緩和を恒久的に設定する。具体的には、プロジェクトの直下に制限緩和スクリプトをファイル化(例:start.ps1)する。スクリプトの中身については、管理者権限でPowerShellを開き、Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass.\kivyenv\Scripts\Activate.ps1を入力する。その後、このスクリプトを実行することで仮想環境の自動有効化が可能となる。

.\をつけて、Activate.ps1(PowerShell用スクリプト)を指定する必要がある。
また、ターミナルの状態は保存できないが、スクリプトをファイル化することで実質ショートカットが可能となる。

成功すると、ターミナルの先頭に (kivyenv) と表示される。

3. 仮想環境有効化後

:one: Kivyをインストール

仮想環境が有効な状態で pip install kivy[base] kivy_examples を入力し実行する。

:bulb: pip … Pythonのパッケージ管理コマンド。Pythonでは、追加機能をインストールするときに常にこの pip を使う。
:bulb: install … パッケージをインストールする命令。
:bulb: kivy[base] … Kivy本体(最小限構成)を導入。kivy は GUI(グラフィカルユーザインタフェース)アプリを作るためのライブラリ。[base] は、その中でも 「最小限構成(ベース部分)」 を指定する。
:bulb: kivy_examples … Kivyの公式サンプルプログラム集を導入。

:arrow_right: pip install kivy だけでもkivy本体はダウンロードできるが、Windowsなどでは追加の依存パッケージ(DLL群) が必要となる。
そこで、pip install kivy[base] kivy_examples を実行することで、 kivy[base] (=Kivyを確実に動かすための最低限の構成)に含まれる依存モジュール(=DLLパッケージ)が自動でpip経由にて入る

:mag_right: モジュールとパッケージの違い
モジュール … Pythonのコードをまとめた1つのファイル。
パッケージ … 複数のモジュールをまとめたフォルダ。

:two: アプリ内コード作成
プロジェクト直下のフォルダにて「main.py」を作成し、アプリのコードを入力する。

:bulb: main.py … Pythonプログラムのエントリーポイント(最初に動くファイル) 。なお、main.py という名前にするのは慣習で、Pythonが特別に「main.pyしか実行できない」という意味ではない。

:three: アプリを実行する
最後に python main.py を入力し実行する。これにより、アプリ画面を表示することができる。

:bulb: pythonmain.py は「Pythonで書かれたただのテキストファイル」 であり、その中の命令(コード)を実行して理解できるのは「Python」のみのため、Pythonに実行の指示をする必要がある。そのため、Pythonのインタプリタ(実行プログラム)を呼び出すのにpythonを入力する。なお、pyでも可。

➡️ つまり、「main.pyをPythonに読ませて、命令通り動かしてもらう」というのがpython main.py

:beginner: 試行錯誤した点

ちなみに、私はアプリを実行したのにターミナルにログだけ出てウィンドウが開かない現象に陥り、これに悩まされてました。なので、ここに当時の試行錯誤の経過を残したいと思います。

:skull_crossbones: kivyでウィンドウが表示されない原因
:one: 初め、kivyが正しくインストールされていないことを疑い、pip show kivyにて確認。kivyのバージョンが確認できたため、インストール済。

:two: 「最小コード」で確認するため、以下の通りコードを入力し実行。

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
def build(self):
return Label(text="Hello, Kivy!", font_size=50)

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

これでもウィンドウが出ないため、ファイルの中身が実際に実行されていないか、実行している対象が main.py ではない可能性を考慮。

:three: ターミナルにてpwdを入力しC:\Users\Owner\Desktop\python-practiceの出力を確認。

:bulb: pwd(print working directory) … 「いま自分がいる場所(カレントディレクトリ)」を表示するコマンド。実行すると、現在のフォルダのフルパス(絶対パス)が出力される。

なお、違うフォルダにいる場合、cd C:\Users\Owner\Desktop\python-practiceで移動。
:bulb: cd(change directory)… フォルダの中を移動するコマンド。

:bulb: dir(directory) … フォルダの中にあるファイルやサブフォルダを一覧表示するコマンド。

➡️ リストの中に main.py の表示を確認。

:four: Kivy 自体はインストールされていて、ファイルの中身が実際に実行されており実行している対象が main.pyである状態を確認。それでもウィンドウが開かないため、描画バックエンド(グラフィックス関連)が動いていない可能性がある。
Windows では 依存ライブラリ(SDL2, glew など)が必要であるところ、現状ではKivyが画面を表示するときに使う「外部の部品(DLLファイル)」が見つからないためウィンドウを開けないことを考慮。

💡DLL(Dynamic Link Library:動的リンクライブラリ)Windowsで動作するプログラムにおいて、複数のアプリケーションから共有して使用できる関数やデータをまとめた外部ファイル。プログラムが実行中に動的にリンク(接続)される(拡張子は .dll )。
つまり、プログラムが必要になったときだけ読み込む「機能の箱」 の役割。

もし「SDL2.dll」や「glew.dll」が見つからない (インストールされていない)と、Python は「呼び出す相手がいない」状態に陥る。結果、ウィンドウが開かなかったり、真っ暗な画面になるか、Kivyが即終了する。

:warning: DLLとモジュールの違い
DLLOSレベルで機能を提供する「外部の部品箱」
Pythonモジュール:Python内で使う「コードの部品箱」

:five: 模索した結果、「main.pyの保存をせず実行していたため、内容が反映されていなかった」という非常に初歩的な凡ミスでした💦

コード編

💡 import … 冒頭での機能導入処理

他のファイルやライブラリを読み込む命令。kivyと同様に必要な部品(モジュール)を外から取り込む。
from kivy.app import App を例にすると、「kivy.app というモジュールから App という部品だけ取り込む」という意味を示す。外部部品でカスタマイズしている。

:warning: なお、基本的にimportはスクリプトの最初(冒頭)に書くのが正しい。

PEP8のルール(公式ガイド)
"Imports should usually be on separate lines and always at the top of the file."
import文は通常、ファイルの先頭にまとめて書くべき。)
技術的には、Pythonでは途中でもimportできるが、Pythonは上から順に実行されるため、もし他の場所(途中や後)で import を書くと、「その時点までに必要な機能がまだ読み込まれていない」状態になる危険がある。分かりやすくするためにも、冒頭に書くべき。

具体的なコード記述の流れは下記の通り。

順番 内容 役割・説明
import文(モジュールの読み込み) 外部ライブラリや標準モジュールを読み込む部分。Pythonの機能を使う準備をする。例:import kivyfrom random import randint
定数・関数・クラスの定義 実際に使う機能や処理を定義する部分。アプリの設計図(class)や動作(def)を書く。
実行部分 プログラムを実際に動かす命令を書く部分。通常は if __name__ == "__main__": から始まり、メイン処理(MyApp().run() など)を実行する。

class MyApp(App): … MyApp というアプリのクラス(設計図)を作成

💡 class … クラス(設計図)を作るための仕組み。
💡 (App) … 「Kivy が用意した App クラスを引き継いで使う」という意味(親の機能を持った子を作るイメージ)。括弧内は継承元(親クラス)を示す。

つまり、「Kivyが用意したAppという基本のアプリ設計図をもとに、自分専用のアプリ(MyApp)という設計図を新しく作る」という意味。


def __init__(self, **kwargs): … 初期化メソッド「コンストラクタ」

💡 def」(define) … Pythonで 「関数(またはメソッド)」を定義 するためのキーワード。
:arrow_right:  処理のかたまりに名前をつけて、後から呼び出せるようにする

:mag_right: 関数 … 一連の処理を一つにまとめたもの。

➡️ クラス内では関数でなく「メソッド」と呼称。つまりクラス外では「関数」と呼称

:mag_right: メソッド … オブジェクト指向プログラミングにおいて、特定のクラスやオブジェクトに所属し、特定の処理をまとめて実行するコードのまとまり。

💡 __init__ 」(initialize) … コンストラクタ。オブジェクトを作った直後に呼ばれる。
別名:ダブルアンダースコアイニット
⇒ そのクラスの最初の設定(初期設定) をする場所。初期化をしなければ、属性(情報)がどこにも設定されずインスタンス(器)が空になるためエラーが起きる。
:beginner: ちなみに、私はこれを忘れてウィンドウが真っ暗になり、気付くまで数十分かかりました。

💡 self自分自身(そのクラスから作られたオブジェクト=インスタンス) を指す。
複数のインスタンスを区別する必要があり、self を使ってプログラムは「どのインスタンスのデータか」を区別する。
ex)self.name…そのインスタンスの「name」という変数を表す。
※「.」は〜のと略すと楽

オブジェクト … 「クラスから作られた実体=インスタンス

  • クラスは「設計図」
  • オブジェクトは「設計図から作られたもの」

:warning: Python ではクラスの中で関数(メソッド)を書くとき、最初の引数は必ずself となる。呼び出したオブジェクトを最初の引数として渡すため、self が必要。
なお、self という名前はただの慣習。

:white_check_mark: 頻出例:
後述するが、Pythonでは直接 app = MyApp() を書きMyAppクラスをオブジェクト化しなくても、MyApp().run() によって MyApp() の生成(オブジェクト化)と run() の実行が連続して行われるため、アプリが動作する。ここで、appは変数
その際、MyApp() が クラスからオブジェクト(インスタンス)を生成し、build(self) メソッドが呼ばれる際、そのオブジェクト自身が self に渡される
したがって、MyApp()(=app = MyApp())でアプリの実体(オブジェクト)を作成し、build(self) が呼ばれると、selfapp(= 生成されたオブジェクト) を指していることとなる。

from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
    def build(self):
        self.label = Label(text="こんにちは!")  # ← アプリ内に label を保存
        return self.label

    def change_text(self, instance):
        self.label.text = "ありがとう!"  # ← build で保存した label を使える

if __name__ == "__main__":
    MyApp().run()
  • self.label
    「このアプリが持っているラベル」
  • def change_text(self, instance)
    「ウィジェット(部品)がイベントを起こした時に呼ばれる関数」
    ➡️ self があるから、クラス内の別の関数同士で同じ部品を共有できるようになる

💡 **kwargs」(keyword arguments) … 「キーワード引数」をまとめて受け取る。
⇒引数が多くある場合、渡された キーワード付き引数(name=…, age=…など)を全部まとめてひとつの辞書(dictionary)にして受け取る仕組み。


super().__init__(**kwargs) … 親クラスの初期化

➡️ Pythonはまず、親クラスの設定を“引き継ぐ準備” をするが、実際の初期設定(属性の作成・内部変数の設定)は親クラスの __init__() の中で行われる。
➡️ super().__init__(**kwargs) を呼ばなければ、親クラスが必要とする「中身(初期状態)」が作られないままになり、エラーが起きる。

✅つまり、super().__init__(**kwargs) を書くと、親クラスの内部基礎設定がすべて終わったあとで、独自設定が安全に実行される。

💡 super() … 親クラスを呼び出すためのキーワード。


if __name__ == "__main__"
:MyApp().run() … 最終実行スイッチ

:warning: 前述した通りPythonは上から順に実行されるため、上に書いてしまうと、まだ MyApp が定義されていないため NameErrorとなる。したがって上記コードは最後に書く。

if __name__ == "__main__":
… 「このファイルが直接実行されたときだけ動かす」
MyApp().run()
… MyAppというクラスのアプリを実際に起動する。

:bulb: __name__ の意味
… Pythonの全てのファイル(=モジュール)には、自動的に __name__ という特別な変数が存在する。その値は、ファイルがどう使われたかによって下記のように変わる。

  • ファイルを直接実行した場合
    "__main__"
  • ファイルをimportされた場合
    そのファイル名(例:"my_module")

:bulb: if __name__ == "__main__":
上の性質を利用して、「このファイルを直接実行したときだけ、この下のコードを動かす」「importされたとき(他のファイルから使われたとき)は動かさない」 という安全スイッチを作っている。
これが無いと、他のファイルがこのファイルをimportしただけで、アプリが勝手に起動してしまう危険がある。

:bulb: MyApp().run() の意味
「アプリを作って動かす」という2つの処理を1行で行う。

MyApp()
… MyApp クラスの**インスタンス(実体)**を作る
.run()
… そのアプリを起動してウィンドウを表示する

実際の内部では以下の処理が行われる。

if __name__ == "__main__":
   app = MyApp()  # ← 設計図(クラス)から実体を作る
   app.run()      # ← その実体を起動してアプリを動かす

以上の処理をMyApp().run()が連続で行っている。

:bulb: run()
Kivyの App クラスに用意されているメソッドで、中で以下の処理を行う。

:one: Kivyのウィンドウを作る
:two: build() を呼び出す(あなたが定義したUIを構築)
:three: 画面を表示してイベントループを開始

意味
if __name__ == "__main__": このファイルが直接実行された時だけ以下を動かす(他ファイルからimportされた場合は実行しない)
MyApp() MyAppクラス(設計図)からアプリの実体(オブジェクト) を作る
.run() そのアプリを起動し、Kivyのウィンドウを開く

さいごに

:white_check_mark: 今回得たスキル

  • 仮想環境(venv)の構築・管理
  • 依存関係の整理とパッケージインストール
  • KivyによるGUIアプリ初期化・動作確認
  • 環境依存エラーの切り分け

これらは業務で言えば、
「開発環境構築」「依存管理」「動作検証」に相当し、ITエンジニアとしての基礎スキルです。


🚀 今後の展開(次章予告)

次の記事では、Kivyを使ったUI構築とイベント処理(ボタン・カード操作など)に進みます。

今後の記事構成(予定):

1. UI画面設計(KivyMD利用)
2. クラス構造とモジュール分割(MVC風)
3. イベント処理+ドラッグ操作の実装
4. 短歌生成ロジックの組込み
5. テストとリファクタリング

引き続き、Qiitaを通して開発記録を残していきます。
読んでいただきありがとうございました。

それではまた。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?