PR

Pythonで簡単に作れる一行日記アプリ – TkinterとExcelを活用した保存機能付き

本サイトはアフィリエイト広告を利用しています
プログラミング

Pythonで一行日記を作ってみます。

Hulu | Disney+ セットプラン
スタディサプリ高校・大学受験講座ルカフェ

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()
  • LabelEntryButtonなどのウィジェットを配置して、日記の入力、保存、保存場所の指定などの機能をユーザーインターフェースに追加します。
  • 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()
Hulu | Disney+ セットプラン

コメント

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