コピペで四則計算できるGUIアプリを作ってみた！

PythonとTkinterを使ってコピペで四則計算できるGUIアプリを作ってみました。

## 目的

プログラミングの知識がない人でも四則計算問題（加法・減法・乗法・除法）の解答を簡単に作成できるようにする。

具体的には、プログラミング知識ゼロの学校の先生でも、小テストや定期テスト問題の解答を短時間で作成できるようにする。

## できること・機能の紹介

作成したアプリでは次のような機能があります。

・**RUNボタン**で、テキストボックス内に貼り付けた四則計算問題の答えを出すことができます。問題をコンマで区切ることによって、複数の問題の解答を一度にまとめて表示できます。

・**INPUTボタン**で、保存しておいたテキストデータを表示させることができます。具体的には、あらかじめ、複数の問題をテキスト保存しておき、それをアプリのINPUTボタンで読み込み、RUNボタンで計算結果を出す、といった使い方ができます。

・**SAVEボタン**でテキストボック内のデータを保存できます。保存する内容はファイルに「追加」されるようになっています。※Wモードではなく、aモードにしてあります。

・**CLEARボタン**でテキストボックス内の内容を消去することができます。

## アプリのコード

コードを実行することで、自動でアプリが起動します。このコードはもちろん、exe化してWinddowsパソコンで使用可能です。

```python:sisoku.py

import tkinter as tk
#import で tkinter を読み込み as を使って tk と省略

import tkinter.filedialog

import re

def dialog_test():

    # ファイル選択ダイアログの表示
    file_path = tkinter.filedialog.askopenfilename()

    if len(file_path) != 0:
        # ファイルが選択された場合

        # ファイルを開いて読み込んでdataに格納
        f = open(file_path)
        data = f.read()
        
        text_box.insert(tkinter.END, (data))
        text_box.delete("2.0")
        f.close()
        
    else:
        # ファイル選択がキャンセルされた場合

     # dataは空にする
        data = ''

    return data


#root = tk.TK( ) でウィンドウを作成
root= tk.Tk()

#ウィンドウのサイズを設定
root.geometry("500x260") 

#テキストボックス（複数行）を生成
text_box = tk.Text()


#テキストボックス（複数行）を配置
text_box = tk.Text(height=10) #行数でサイズを指定
text_box.pack() 

#ボタンを作成
button_1 = tk.Button(text="RUN")
button_1.pack()
button_2 = tk.Button(text="INPUT")
button_2.pack()
button_3 = tk.Button(text="SAVE")
button_3.pack()
button_4 = tk.Button(text="CLEAR")
button_4.pack()


#関数でテキストボックスに入力された値を取得
def click():
    input_text = text_box.get( "0.0", "end")
    text_box.insert(tkinter.END, *calc(input_text))
    #text_box.delete("1.0", tk.END)
    text_box.delete("0.0", "3.2")
   
def calc(*exps):
    for exp in exps:
        s = re.sub(r"([\d\)])\(", r"\1*(", exp.replace("×", "*").replace("÷", "/"))
        yield exp, s, eval(s)  


def save(event=None):
    """名前を付けて保存する"""
    f_type = [('Text', '*.txt')]
    file_path = tkinter.filedialog.asksaveasfilename(
        filetypes=f_type)

    if file_path != "":
        with open(file_path, "a") as f:
            f.write(text_box.get("1.0", "end-1c"))

    return
    

def clear():
    
    text_box.delete("0.0", tk.END)
    

button_1["command"] = click    #関数とボタンを押したときのアクションを関連付ける
button_2["command"] = dialog_test
button_3["command"] = save
button_4["command"] = clear


#root.mainloop( ) で作成したウィンドウを表示
root.mainloop()


```

## 問題点と課題

実はこのアプリには、もともと四則計算の問題を作成する機能も組み込まれていました。作成した問題を保存しておくために保存機能を備えていたのです。

しかし、問題作成にあたり、余計な括弧が表示されてしまい、今のところうまくいっていません。

同様の現象は、このアプリで複数の問題の解答を得ようとするときにも生じます。

例えば、アプリを起動し、次のように打ち込み、RUNボタンを押します。

```
(+9)×(+2), (-2)×(-9), (+2)×(-4), (-7)×(+2)
```

すると、次のように表示されてしまいます。

```
{18 18 -8 -14}
```

このとき、両足にある括弧{}は不要で、表示させたくありません。

解答だけならさほど問題ではありませんが、問題作成のときにどうしても邪魔になるのです。

しかし、この計算をする関数は、人から教えてもらったもので、自分では修正不可です。

具体的には、次の部分です。

```
def calc(*exps):
    for exp in exps:
        s = re.sub(r"([\d\)])\(", r"\1*(", exp.replace("×", "*").replace("÷", "/"))
        yield exp, s, eval(s)  

```

どなたか、不要な括弧をなくす方法があったら教えてください。

ちなみに、このままのコードでは「3×3 3*3 9」のように途中の式も入ってしまいます。途中の式は必要ないので、deleteで表示させないようにしていますが、できれば最初からない方がいいです。

よろしくお願いします。