# -*- coding: utf-8 -*-
"""
テキストボックスと統計処理
"""

import tkinter as tk
import tkinter.scrolledtext as st
import tkinter.filedialog as fd


# 追加した関数
# txBox からデータを読んで統計をとった結果をla_varに書き込む
def toukei(txBox:st.ScrolledText, la_var:tk.StringVar):
    # 変数の初期化
    goukei = 0.0
    kazu   = 0

    # 文字列として受け取りつつ行で分けてリスト化
    s_all  = txBox.get("1.0", "end").splitlines()

    # 1行ずつ数値化しつつ合計の計算と数え上げ（できなかったら無視）
    for s in s_all:
        try:
            goukei += float(s)
            kazu += 1
        except ValueError:
            pass
    
    # 計算結果を文字列化して書き込み
    la_var.set(f"結果：\nデータ数：{kazu}、合計値：{goukei:.2f}、平均値：{goukei/kazu:.2f}")


def loadFile(txBox:st.ScrolledText):
    """ 指示１ここから """
    # このコメントブロックの下に，
    # ファイルダイアログで「読み込むファイル」の名前を選択するよう
    # 命令文を書きなさい．

    f_name = fd.askopenfilename(title="読み込むファイル", filetypes=[("テキスト", ".txt")])
    """ 指示１ここまで """

    with open(f_name, "r", encoding="utf-8") as file:
        txBox.insert("1.0", file.read())

def saveFile(txBox:st.ScrolledText):
    f_name = fd.asksaveasfilename(title="書き込むファイル", filetypes=[("テキスト", ".txt")], defaultextension=".txt")

    with open(f_name, "w", encoding="utf-8") as file:
        """ 指示２ここから """
        # このコメントブロックの下に，
        # テキストボックスの中身を「書き込むファイル」に保存するよう
        # 命令文を書きなさい．

        file.write(txBox.get("1.0", "end"))
        """ 指示２ここから """


def main():
    base = tk.Tk()
    base.title("$u_id")

    # メニューバー
    mBar  = tk.Menu(base)

    # ファイル
    mFile = tk.Menu(mBar, tearoff=False)
    """ 指示３ここから """
    # このコメントブロックの下に，
    # メニューの「開く」を押すと loadFile を呼び出す
    # メニューの「保存」を押すと saveFile を呼び出す
    # イベントを登録する命令文になるようそれぞれ修正しなさい．
    # なお，開くも保存も txBox の文字列を対象とする．

    mFile.add_command(label="開く", command=lambda:loadFile(txBox))
    mFile.add_command(label="保存", command=lambda:saveFile(txBox))
    """ 指示３ここまで """

    mFile.add_separator()
    mFile.add_command(label="終了", command=base.destroy)

    # メニューの構成
    mBar.add_cascade(label="ファイル", menu=mFile)
    base.config(menu=mBar)

    txBox  = st.ScrolledText(base, width=40, height=20)
    la_var = tk.StringVar(value="結果：")
    label  = tk.Label(base, height=2, textvariable=la_var, anchor="nw", justify='left')

    # イベント処理を追加
    bt     = tk.Button(base, text="処理", command=lambda:toukei(txBox,la_var))

    txBox.pack()
    bt.pack(anchor="w")
    label.pack(fill="x")

    base.mainloop()             # GUIの始動


if __name__ == "__main__":
    main()
