【コピペで動く】Pythonで簡単なToDoリストアプリを作ろう!(テキストベース)
PythonをコマンドプロンプトやPowerShellでPC上で動かすには、Pythonをダウンロードしてインストールする必要があります。
まだの方はPythonのインストールと開発環境の構築の記事を参考にして、Pythonをインストールしてください。
こんにちは!数ヶ月前までプログラミング知識ゼロだった私が、AIと一緒にWebサイトを立ち上げる中で学んだことを発信しています。
今回は、プログラミング学習の第一歩として超おすすめな「ToDoリストアプリ」をPythonで作っていきます。この記事のゴールはただ一つ!あなたに「自分で作ったプログラムが動いた!」という感動を体験してもらうことです。
難しい理論は後回し!まずはコピペで動くコードを触りながら、「なるほど、こうやって動いてるのか!」を実感していきましょう。専門用語は私がつまづいた経験を元に、とことん噛み砕いて説明するので安心してくださいね。
まずは完成品を動かしてみよう!
論より証拠!まずは完成版のToDoリストアプリを動かしてみましょう。下のコードを全部コピーして、todo.pyという名前でファイルを作成し、貼り付けて保存してください。
# -*- coding: utf-8 -*-
TASKS_FILE = "tasks.txt"
def load_tasks():
"""ファイルからタスクを読み込む関数"""
try:
with open(TASKS_FILE, "r", encoding="utf-8") as f:
# strip()で各行の末尾にある改行文字を取り除く
tasks = [line.strip() for line in f.readlines()]
except FileNotFoundError:
# ファイルが存在しない場合は空のリストを返す
tasks = []
return tasks
def save_tasks(tasks):
"""タスクをファイルに保存する関数"""
with open(TASKS_FILE, "w", encoding="utf-8") as f:
# 各タスクの末尾に改行を追加して書き込む
for task in tasks:
f.write(task + "\n")
def list_tasks(tasks):
"""タスクの一覧を表示する関数"""
if not tasks:
print("✅ タスクはありません。")
return
print("--- ToDoリスト ---")
# enumerateを使って、インデックス(番号)とタスクを同時に取得
for i, task in enumerate(tasks):
print(f"{i + 1}: {task}")
print("------------------")
def add_task(tasks):
"""タスクを追加する関数"""
task = input("追加するタスクを入力してください: ")
if task:
tasks.append(task)
save_tasks(tasks)
print(f"✨ タスク「{task}」を追加しました。")
else:
print("⚠️ タスクが入力されていません。")
def delete_task(tasks):
"""タスクを削除する関数"""
list_tasks(tasks)
if not tasks:
return
try:
# ユーザーに番号でタスクを選んでもらう
num_str = input("削除するタスクの番号を入力してください: ")
num = int(num_str)
# ユーザーは1から数えるが、リストのインデックスは0からなので調整
if 1 <= num <= len(tasks):
removed_task = tasks.pop(num - 1)
save_tasks(tasks)
print(f"🗑️ タスク「{removed_task}」を削除しました。")
else:
print("⚠️ その番号のタスクはありません。")
except ValueError:
# 数字以外のものが入力された場合のエラー処理
print("⚠️ 番号を正しく入力してください。")
def main():
"""メインの処理を行う関数"""
tasks = load_tasks()
while True:
print("\n何をしますか?")
command = input("1:一覧表示, 2:追加, 3:削除, 9:終了 > ")
if command == "1":
list_tasks(tasks)
elif command == "2":
add_task(tasks)
elif command == "3":
delete_task(tasks)
elif command == "9":
print("👋 アプリを終了します。お疲れ様でした!")
break
else:
print("⚠️ 1, 2, 3, 9 のいずれかを入力してください。")
if __name__ == "__main__":
main()
保存したら、ターミナル(WindowsならコマンドプロンプトやPowerShell)を開いて、保存したファイルがあるディレクトリに移動し、次のコマンドを実行します。
python todo.py
どうでしょう?「何をしますか?」と聞かれましたか? 「2」を入力してタスクを追加したり、「1」で一覧を確認したり、「3」で削除したりしてみてください。「9」でアプリを終了できます。すごい、もう立派なアプリです!
ここからは、この魔法の呪文(コード)が、一体何をやっているのかを一緒に解き明かしていきましょう。
ステップ1:タスクの「追加」と「一覧表示」だけの超シンプル版
いきなり全部を理解しようとすると大変です。まずは、アプリの心臓部である「タスクの追加」と「一覧表示」機能だけに絞った、もっと簡単なコードから見ていきましょう。
# タスクを保存するための空のリスト(配列のようなもの)を用意
tasks = []
# 無限に処理を繰り返す
while True:
print("\n何をしますか?")
command = input("1:一覧表示, 2:追加, 9:終了 > ")
if command == "1":
print("--- ToDoリスト ---")
for task in tasks:
print(task)
print("------------------")
elif command == "2":
task = input("追加するタスクを入力してください: ")
tasks.append(task)
print(f"✨ タスク「{task}」を追加しました。")
elif command == "9":
print("👋 アプリを終了します。")
break # ループを抜ける
else:
print("⚠️ 1, 2, 9 のいずれかを入力してください。")
この短いコードに、プログラミングの基本がギュッと詰まっています。
tasks = []: これがタスクを保存しておくための「リスト」です。最初は空っぽの箱を用意するイメージです。while True:: これは「無限ループ」です。「9」が入力されるまで、ずっとユーザーの命令を待ち続けてくれます。私が最初に「どうやってプログラムを待機させればいいんだ?」とAIに聞いたら教えてくれた魔法の呪文です。input(...): ユーザーがキーボードで入力した文字を受け取ります。if / elif / else: 入力されたcommandの値によって、処理を分けます。「もし1なら一覧表示、もし2なら追加、それ以外なら…」という条件分岐ですね。tasks.append(task):inputで受け取ったタスクを、tasksリストの末尾に追加します。for task in tasks::tasksリストの中身を、先頭から一つずつ取り出してtaskという変数に入れ、print(task)で画面に表示します。break: これが無限ループを終わらせるための脱出スイッチです。これを忘れると、プログラムを強制終了するしかなくなります(私もよくやりました…!)。
ステップ2:「削除機能」と「エラー対策」を追加する
次に追加したタスクを削除できるようにしましょう。ただ削除するだけでは不便なので、どのタスクを消すか番号で選べるようにします。ここで少しレベルアップしますよ!
# ... (ステップ1のコードの `if command == "1":` の部分を以下に差し替え) ...
if command == "1":
print("--- ToDoリスト ---")
# enumerate を使うと、リストの番号と中身を同時に取り出せる
for i, task in enumerate(tasks):
# iは0から始まるので、表示するときは1を足す
print(f"{i + 1}: {task}")
print("------------------")
# ... (ステップ1のコードの `elif command == "2":` の後に以下を追加) ...
elif command == "3": # 削除機能を追加
# 先に現在のリストを表示して、ユーザーが選びやすくする
for i, task in enumerate(tasks):
print(f"{i + 1}: {task}")
try:
num_str = input("削除するタスクの番号を入力してください: ")
num = int(num_str) # 入力された文字を数字に変換
# pop()で指定した番号(インデックス)の要素をリストから削除
removed_task = tasks.pop(num - 1)
print(f"🗑️ タスク「{removed_task}」を削除しました。")
except ValueError:
print("⚠️ 番号を正しく入力してください。")
except IndexError:
print("⚠️ その番号のタスクはありません。")
新しいポイントがいくつか出てきました。
enumerate(tasks): これ、めちゃくちゃ便利です!リストの中身をループで回すときに、自動で「0, 1, 2...」と番号を振ってくれます。おかげでf"{i + 1}: {task}"のように、タスクに番号を付けて表示できるわけです。tasks.pop(num - 1): これが削除のキモです。pop()はリストから指定した位置の要素を取り除きます。num - 1となっているのは、ユーザーは「1番」と入力しますが、プログラムの世界(リストのインデックス)では「0番」から数え始めるため、1つズラしてあげる必要があるからです。この「0から始まる」というのは、プログラミング初心者が必ず一度は混乱するポイントなので、覚えておきましょう!try / except: これがエラー対策の仕組みです。「とりあえずtry:の中を実行してみて、もしエラーが出たらexcept:で捕まえて、クラッシュする代わりにこっちの処理をしてね」という意味です。ValueError:int()は文字を数字に変換しますが、「あ」のような数字にできない文字が入力されるとこのエラーが出ます。IndexError:pop()でリストに存在しない番号(例えば、タスクが3つしかないのに「5」を指定するなど)を消そうとするとこのエラーが出ます。
「ユーザーは開発者の思った通りには操作してくれない」というのは鉄則です。こうしたエラー対策を入れることで、アプリが不意に落ちてしまうのを防ぎ、より親切で頑丈なプログラムになります。
ステップ3:データをファイルに保存して、消えないようにする
今のアプリには大きな弱点があります。一度プログラムを終了すると、追加したタスクが全て消えてしまうのです。これではToDoリストとして使えませんよね。そこで、タスクをファイルに保存し、次回起動時に読み込む機能を追加します。
# ファイル名を決めておく
TASKS_FILE = "tasks.txt"
# --- 関数の定義 ---
def load_tasks():
try:
# "r"は読み込み(read)モード
with open(TASKS_FILE, "r", encoding="utf-8") as f:
# readlines()で全行をリストとして読み込み、strip()で改行文字を削除
tasks = [line.strip() for line in f.readlines()]
except FileNotFoundError:
# 最初の一回など、ファイルがない場合はエラーになるので、空のリストを返す
tasks = []
return tasks
def save_tasks(tasks):
# "w"は書き込み(write)モード。ファイルがなければ新規作成される
with open(TASKS_FILE, "w", encoding="utf-8") as f:
for task in tasks:
# ファイルに書き込むときは、各タスクの最後に改行(\n)を入れる
f.write(task + "\n")
# --- メインの処理 ---
# アプリ起動時に、まずファイルからタスクを読み込む
tasks = load_tasks()
# タスクを追加・削除するたびに、save_tasks(tasks)を呼び出すように変更する
# (最初の完成版コードを参照してください)
ここでのポイントは「ファイルの読み書き」です。
with open(...) as f:: Pythonでファイルを扱うときの定番フレーズです。こう書くと、ファイルの読み書きが終わった後に、自動でファイルを閉じてくれるので安全です。「AIに『Pythonで安全にファイルを扱う方法を教えて』と聞いたら、真っ先にこれを勧められた」という経験があります。- モード ("r", "w"):
open()の第二引数で、ファイルをどう開くかを指定します。"r"は読み込み専用(Read)、"w"は書き込み専用(Write)です。"w"モードは、ファイルが既に存在する場合、中身を全部消して上書きするので注意が必要です。 encoding="utf-8": これはおまじないだと思ってください。日本語などのマルチバイト文字を正しく扱うために必要で、指定しないと文字化けの原因になります。- 読み込み (load):
f.readlines()でファイルの内容を1行ずつのリストとして読み込みます。ただし、各行の末尾には改行文字(\n)が含まれてしまうので、line.strip()でこれを取り除いて綺麗なデータにしています。 - 書き込み (save):
f.write()でファイルに文字列を書き込みます。今度は逆に、各タスクを別々の行として保存したいので、タスクの文字列の最後に改行文字\nを付け足してあげます。これを忘れると、全てのタスクが1行に繋がってしまい、正しく読み込めなくなります(私もこれで15分くらい悩みました…)。
そして、一番最初に紹介した完成コードのように、処理の塊をdefを使って「関数」としてまとめてあげる(これをリファクタリングと言います)と、コードがスッキリして、どこで何をやっているのかが格段に分かりやすくなります。コードが長くなってきたら、機能ごとに箱(関数)に分けて整理整頓する癖をつけると、後々の自分が楽になりますよ。
まとめ:動けば勝ち!そして次のステップへ
お疲れ様でした!これであなたは、Pythonで自分だけのToDoリストアプリを作る力を手に入れました。重要なのは、完璧に理解することよりも、「コピペでもいいから、まず動かしてみる」ことです。動くものがあって、それを少しずついじりながら「これを変えたらどうなるんだろう?」と実験していくのが、上達への一番の近道だと、私は身をもって体験しました。
エラーは怖いものではなく、あなたのプログラムがもっと良くなるためのヒントです。エラーメッセージが読めなくても、そのままAIに貼り付けて「このエラーはどういう意味で、どうすれば直る?」と聞けば、大抵は解決策を教えてくれます。
ぜひ、今回作ったアプリに「タスクの編集機能」や「完了したタスクにチェックを入れる機能」などを追加して、あなただけの最強のToDoリストに育ててみてください!
次のステップへ
基本的なアプリが作れるようになったら、次はいよいよ計算に挑戦してみませんか?四則演算ができるシンプルな電卓アプリの作り方を紹介しています。
Pythonで電卓アプリを作ってみよう(四則演算)