Pythonで一行日記を作ってみます。
Pythonのtkinterを使って一行日記アプリを作成し、記録をExcelファイルに保存するプログラムを作成できます。
pandasライブラリを使用してExcelにデータを保存し、日付と日記内容を記録します。
指定された保存場所に記憶し、日記を追記する機能を持たせるためにtkinter.filedialogを使用してファイルの保存先を選択できるようにします。
また、保存場所を次回起動時に記憶させるために、設定ファイル(config.jsonなど)を使って保存場所を保持し、保存場所がわかるようにパスを画面に表示させます。

ソースコードの詳細説明
以下に、ソースコードの各部分を詳細に説明します。
必要なライブラリのインポート
import tkinter as tk
from tkinter import messagebox, filedialog
import pandas as pd
from datetime import datetime
import os
import json
tkinter: Python標準のGUIライブラリで、簡単なウィンドウアプリケーションを作成するのに使用します。messagebox: メッセージボックス(通知や警告ダイアログ)を表示するためのモジュール。filedialog: ファイル保存ダイアログを開き、ファイルの保存先を選択できるようにするためのモジュール。pandas: Excelファイルの読み書きに使用。データ操作が簡単にできるライブラリです。datetime: 日付や時間の管理に使います。日記の保存日時を取得するために使用。os: ファイルの存在確認など、システム関連の操作を行います。json: 設定ファイルをJSON形式で読み書きするためのライブラリ。
設定ファイルの管理関数
CONFIG_FILE = "config.json"
CONFIG_FILE変数は、保存場所を記憶するための設定ファイル(config.json)の名前を定義しています。
def load_config():
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "r") as f:
return json.load(f)
return {}
load_config()関数は、config.jsonファイルが存在するかどうかを確認し、存在すれば内容を読み込んで返します。ファイルが存在しない場合、空の辞書を返します。
def save_config(config):
with open(CONFIG_FILE, "w") as f:
json.dump(config, f)
save_config()関数は、設定をconfig.jsonに書き込みます。保存場所などの設定情報を保持するために使用されます。
保存場所のラベルを更新する関数
def update_save_path_label():
config = load_config()
save_path = config.get("save_path", "未設定")
save_path_label.config(text=f"保存場所: {save_path}")
update_save_path_label()は、保存場所のパスを設定画面に表示するための関数です。config.jsonから保存場所を取得し、保存場所が設定されていない場合は「未設定」と表示します。
日記をExcelに保存する関数
def save_diary():
diary_text = entry.get()
if not diary_text:
messagebox.showwarning("Warning", "日記の内容を入力してください")
return
now = datetime.now()
timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
save_diary()は、日記の内容を入力フィールド(entry)から取得し、日時とともにExcelに保存する機能を担当します。- 日記が空の場合は警告ダイアログが表示されます(
messagebox.showwarning)。 datetime.now()を使用して現在の日時を取得し、timestampに保存します。
new_data = pd.DataFrame({"日時": [timestamp], "日記内容": [diary_text]})
pandas.DataFrameを使って、日記の内容と日時を新しいデータとして保存します。
config = load_config()
if "save_path" not in config:
messagebox.showwarning("Warning", "保存場所を指定してください")
return
# Excelファイルのパスを取得
file_path = config["save_path"]
- 設定ファイルから保存場所を取得し、指定されていなければ警告を表示します。
if os.path.exists(file_path):
existing_data = pd.read_excel(file_path)
updated_data = pd.concat([existing_data, new_data], ignore_index=True)
else:
updated_data = new_data
- Excelファイルが存在すれば既存のデータを読み込み、
pandas.concatで新しいデータを追加します。ファイルが存在しなければ新規作成されます。
updated_data.to_excel(file_path, index=False)
messagebox.showinfo("Success", "日記を保存しました")
entry.delete(0, tk.END)
- 最終的に
to_excel()を使ってデータをExcelに書き込み、日記の内容が保存されたことを通知するダイアログを表示します。保存後は、入力フィールドをクリアします。
保存場所の選択と表示
def select_save_location():
file_path = filedialog.asksaveasfilename(
defaultextension=".xlsx",
filetypes=[("Excel files", "*.xlsx")],
title="保存場所を選択"
)
if file_path:
config = load_config()
config["save_path"] = file_path
save_config(config)
update_save_path_label() # 保存場所ラベルを更新
messagebox.showinfo("Success", f"保存場所を設定しました: {file_path}")
select_save_location()は、ユーザーがExcelファイルの保存先を選択できるようにするための関数です。ファイルダイアログを開いて保存先を選択させ、設定ファイルに保存します。また、選択した保存場所を画面のラベルに反映させます。
GUIの設定
root = tk.Tk()
root.title("一行日記")
root.geometry("400x250")
- アプリのメインウィンドウを作成し、ウィンドウのタイトルやサイズを指定します。
各種ウィジェットの配置
label = tk.Label(root, text="一行日記を入力してください:")
label.pack(pady=10)
entry = tk.Entry(root, width=50)
entry.pack(pady=10)
save_path_label = tk.Label(root, text="保存場所: 未設定", wraplength=350)
save_path_label.pack(pady=10)
save_button = tk.Button(root, text="保存", command=save_diary)
save_button.pack(pady=10)
select_button = tk.Button(root, text="保存場所を指定", command=select_save_location)
select_button.pack(pady=10)
update_save_path_label()
Label、Entry、Buttonなどのウィジェットを配置して、日記の入力、保存、保存場所の指定などの機能をユーザーインターフェースに追加します。update_save_path_label()を呼び出して、アプリ起動時に保存場所を表示します。
メインループ
root.mainloop()
- Tkinterアプリのメインイベントループを開始します。これにより、ウィンドウが表示され続け、ユーザーの操作を待ち受けます。
まとめ
このアプリは、ユーザーが一行日記を入力し、指定した保存場所にあるExcelファイルに追記できるシンプルな日記アプリです。保存場所は設定ファイルに記憶され、アプリ再起動時にも自動的に読み込まれます。
全体のソース
import tkinter as tk
from tkinter import messagebox, filedialog
import pandas as pd
from datetime import datetime
import os
import json
# 設定ファイルのパス
CONFIG_FILE = "config.json"
# 設定ファイルの読み込み
def load_config():
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "r") as f:
return json.load(f)
return {}
# 設定ファイルの保存
def save_config(config):
with open(CONFIG_FILE, "w") as f:
json.dump(config, f)
# 保存場所のラベルを更新する関数
def update_save_path_label():
config = load_config()
save_path = config.get("save_path", "未設定")
save_path_label.config(text=f"保存場所: {save_path}")
# 日記データをExcelに保存する関数
def save_diary():
diary_text = entry.get()
if not diary_text:
messagebox.showwarning("Warning", "日記の内容を入力してください")
return
now = datetime.now()
timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
new_data = pd.DataFrame({"日時": [timestamp], "日記内容": [diary_text]})
config = load_config()
if "save_path" not in config:
messagebox.showwarning("Warning", "保存場所を指定してください")
return
# Excelファイルのパスを取得
file_path = config["save_path"]
# 既存のExcelファイルがあれば追記、なければ新規作成
if os.path.exists(file_path):
existing_data = pd.read_excel(file_path)
updated_data = pd.concat([existing_data, new_data], ignore_index=True)
else:
updated_data = new_data
# Excelに保存
updated_data.to_excel(file_path, index=False)
messagebox.showinfo("Success", "日記を保存しました")
entry.delete(0, tk.END) # テキストボックスをクリア
# 保存場所の選択
def select_save_location():
file_path = filedialog.asksaveasfilename(
defaultextension=".xlsx",
filetypes=[("Excel files", "*.xlsx")],
title="保存場所を選択"
)
if file_path:
config = load_config()
config["save_path"] = file_path
save_config(config)
update_save_path_label() # 保存場所ラベルを更新
messagebox.showinfo("Success", f"保存場所を設定しました: {file_path}")
# アプリのウィンドウ設定
root = tk.Tk()
root.title("一行日記")
root.geometry("400x250")
# 説明ラベル
label = tk.Label(root, text="一行日記を入力してください:")
label.pack(pady=10)
# 日記入力用エントリー
entry = tk.Entry(root, width=50)
entry.pack(pady=10)
# 保存場所の表示ラベル
save_path_label = tk.Label(root, text="保存場所: 未設定", wraplength=350)
save_path_label.pack(pady=10)
# 保存ボタン
save_button = tk.Button(root, text="保存", command=save_diary)
save_button.pack(pady=10)
# 保存場所を選択するボタン
select_button = tk.Button(root, text="保存場所を指定", command=select_save_location)
select_button.pack(pady=10)
# アプリ起動時に保存場所を更新
update_save_path_label()
# メインループ
root.mainloop()





コメント