プログラムソースコード「家計簿アプリ」更新日:2024/10/15

2024年11月15日金曜日

source code 公開

t f B! P L

  



ソースコード「KDmain.py」更新日:2024/10/12



######################################################
# ファイル名:KDmain.py
# バージョン:Ver1.0
# 機能:アプリの基幹制御
# 作成日:2024/10/12
# 更新日:2024/10/12
######################################################

import os
import json
from KDpay import PayManager
from KDui import UIManager

file_path = 'KDjson.json'

def main():
    # 既存ファイルを確認
    if not os.path.exists(file_path):
        # 無ければ作成
        with open( file_path, mode='w', encoding="UTF-8" ) as open_json:
            initial_list = [{
                            "month"   :  0    , #"月"
                            "day"     :  0    , #"日"
                            "content" : "内訳",
                            "amount"  :  0      #"金額"
            } ]
            json.dump( initial_list, open_json, indent=4, ensure_ascii=False)

    # ペイ(収支)データ管理用クラスオブジェクト作成    
    pay_manager = PayManager()
   
    # ファイルの読み込み
    with open( file_path, mode='r', encoding="UTF-8") as open_json:
        json_load_list = json.load(open_json)

    # 読み込んだファイルをペイ(収支)データ管理用クラスオブジェクトに追加
    for pay_data in json_load_list:
        pay_manager.add_pay(pay_data)

    # 入力画面管理用クラスオブジェクト作成    
    ui_manager = UIManager(pay_manager)

    # ファイル書き込み
    with open(file_path, mode='w',encoding="UTF-8") as open_json:
        updated_data_list=[]
        for pay in pay_manager.pay_data_list:
            updated_data_list.append({
                                "month":   pay.month,              
                                "day":     pay.day,
                                "content": pay.content,
                                "amount":  pay.amount
            })
        json.dump(updated_data_list, open_json ,indent=4,ensure_ascii=False)

# プログラム開始宣言
if __name__ == '__main__':
    main()
 

 


 

 

 

ソースコード「KDpay.py」更新日:2024/10/12

 

######################################################
# ファイル名:KDpay.py
# バージョン:Ver1.0
# 機能:レコードを管理
# 作成日:2024/10/12
# 更新日:2024/10/12
######################################################

class Pay:
    def __init__(self, pay_data):
        # ペイ(収支)データの初期化
        self.month   = pay_data["month"]      
        self.day     = pay_data["day"]
        self.content = pay_data["content"]
        self.amount  = pay_data["amount"]

class PayManager:
    def __init__(self):
        # ペイデータリストの初期化
        self.pay_data_list = []

    def add_pay(self, pay_data):
        # 新しいペイデータをペイデータリストに追加
        new_pay_data = Pay(pay_data)
        self.pay_data_list.append(new_pay_data)

    def delete_pay(self, pay_data):
        # ペイデータをペイデータリストから削除
        self.pay_data_list.pop(pay_data)






ソースコード「KDui.py」更新日:2024/10/15


######################################################
# ファイル名:KDui.py
# バージョン:Ver1.0
# 機能:CUIで入力画面を制御
# 作成日:2024/10/12
# 更新日:2024/10/15
# 更新内容:
#       pandas.json_normalize()で
#       辞書のリストをDataFrameに変換
######################################################

import pandas as pd

class UIManager:
    def __init__(self, pay_manager):
        # UIの初期化
        self.pay_manager = pay_manager
        # 入力画面呼び出し
        self.command_input()

    def command_input(self):
        # 入力画面の表示
        while True:
            self.get_pay_amount()
            command = input("(1表示、2追加、3更新、4削除、5残高、0終了)どの操作を行いますか?番号: ")
            if command == "0": #'終了'
                break
            elif command == "1": #'表示'
                self.show_pays()
            elif command == "2": #'追加'
                self.add_pay()
            elif command == "3": #'更新'
                self.update_pay()
            elif command == "4": #'削除'
                self.delete_pay()
            elif command == "5": #'残高'
                self.get_pay_amount()
            else:
                print("0~4の番号を入力してください。")

    def show_pays(self):
        # リストを表示
        """
        cnt = 0
        for pay_data in self.pay_manager.pay_data_list:
            print(f"ID:{cnt}{vars(self.pay_manager.pay_data_list[cnt])}")
            cnt += 1
        """
        get_pay_amount_list=[]
        for pay in self.pay_manager.pay_data_list:
            get_pay_amount_list.append({
                "month":   pay.month,              
                "day":     pay.day,
                "content": pay.content,
                "amount":  pay.amount
            })

        print(pd.json_normalize(get_pay_amount_list))


    def add_pay(self):
        # レコード(辞書)を追加
        try:
            month   = int(input("月を入力(数値)してください: "))      
            day     = int(input("日を入力(数値)してください: "))
            content =     input("内訳を入力してください: ")
            amount  = int(input("金額を入力(数値)してください: "))
        except ValueError:
            print("エラー:数値以外が入力されました")
            return self.add_pay()

        new_pay_dict = {
            "month"  : month,
            "day"    : day,
            "content": content,
            "amount" : amount
        }
        self.pay_manager.add_pay(new_pay_dict)

    def update_pay(self):
        #レコード(辞書)を更新
        self.delete_pay()
        self.add_pay()
       
    def delete_pay(self):
        #レコード(辞書)を削除
        delete_column = input("削除する行のID番号を入力してください: ")
        number = int(delete_column)
        self.pay_manager.delete_pay(number)
   
    def get_pay_amount(self):

        get_pay_amount_list=[]
        for pay in self.pay_manager.pay_data_list:
            get_pay_amount_list.append({
                "month":   pay.month,              
                "day":     pay.day,
                "content": pay.content,
                "amount":  pay.amount
            })
        get_pay_amount_total_list = [d.get("amount") for d in get_pay_amount_list]
        print(f"現在の残高は{sum(get_pay_amount_total_list)*-1}円です")


 









このブログを検索

アーカイブ

カテゴリー

QooQ