2023/04/23
ChatGPT4を使う(3)
今回はChatGPT4に、GUIで操作できる関数電卓アプリを作ってもらいました。指示内容は以下の通りです。
以下の要件の関数電卓のプログラムをPythonで書いてください。
要件
1. 四則演算ができる。
2. 平方根の計算ができる。
3. 三角関数の計算がDegとRad単位でできる。
4. 指数、対数計算ができる。
5. 階乗計算ができる。
6. プログラムの実行画面はtkinterで作成する。
7. 実行画面は上部に結果を表示するテキストボックスを設ける。
8. テンキーは7.のテキストボックスの右下側に設置し、関数ボタンは7.のテキストボックスの左下に設置する。
ChatGPT4から返されたPythonコードはこんな感じでした。
import tkinter as tk早速実行してみました。外観は大変いい感じです。
import math
class CalculatorApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("関数電卓")
self.result_var = tk.StringVar()
self.create_widgets()
def create_widgets(self):
result_entry = tk.Entry(self, textvariable=self.result_var, state="readonly", width=30)
result_entry.grid(row=0, column=0, columnspan=5)
buttons = [
('7', 1, 1), ('8', 1, 2), ('9', 1, 3), ('/', 1, 4),
('4', 2, 1), ('5', 2, 2), ('6', 2, 3), ('*', 2, 4),
('1', 3, 1), ('2', 3, 2), ('3', 3, 3), ('-', 3, 4),
('0', 4, 1), ('.', 4, 2), ('=', 4, 3), ('+', 4, 4),
('sqrt', 5, 1), ('sin', 5, 2), ('cos', 5, 3), ('tan', 5, 4),
('exp', 6, 1), ('log', 6, 2), ('ln', 6, 3), ('!', 6, 4)
]
for (text, row, column) in buttons:
button = tk.Button(self, text=text, command=lambda t=text: self.on_click(t))
button.grid(row=row, column=column)
def on_click(self, text):
if text == '=':
try:
expression = self.result_var.get()
result = eval(expression, {'__builtins__': None}, {
'sqrt': math.sqrt,
'sin': lambda x: math.sin(math.radians(x)),
'cos': lambda x: math.cos(math.radians(x)),
'tan': lambda x: math.tan(math.radians(x)),
'exp': math.exp,
'log': math.log10,
'ln': math.log,
'factorial': math.factorial
})
self.result_var.set(result)
except Exception as e:
self.result_var.set("エラー")
elif text in ('sqrt', 'sin', 'cos', 'tan', 'exp', 'log', 'ln', 'factorial'):
self.result_var.set(f"{text}(")
else:
current_text = self.result_var.get()
self.result_var.set(current_text + text)
if __name__ == "__main__":
app = CalculatorApp()
app.mainloop()

1. テキストボックスの文字が左寄りで違和感がある。
2. 入力ミスした際に修正ができない。
3. 閉じ括弧 )がないので、特殊関数の計算ができない。
改めて、問題点の修正をお願いしました。
以下の要件を追加して、Pythonのプログラムを修正してください。修正されたプログラムは以下の通りです。
1. テキストボックスに表示する文字は右寄せにする。
2. テキストボックスに表示された結果を消去するACボタンを設置する。
3. ボタンに「括弧(」と「括弧)」を設置する。
4. 関数ボタンはテンキーの左側に設置する。
import tkinter as tk修正されたプログラムを実行しました。
import math
class CalculatorApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("関数電卓")
self.result_var = tk.StringVar()
self.create_widgets()
def create_widgets(self):
result_entry = tk.Entry(self, textvariable=self.result_var, state="readonly", width=30, justify='right')
result_entry.grid(row=0, column=0, columnspan=5)
buttons = [
('(', 1, 0), ('7', 1, 1), ('8', 1, 2), ('9', 1, 3), ('/', 1, 4),
(')', 2, 0), ('4', 2, 1), ('5', 2, 2), ('6', 2, 3), ('*', 2, 4),
('AC', 3, 0), ('1', 3, 1), ('2', 3, 2), ('3', 3, 3), ('-', 3, 4),
('sqrt', 4, 0), ('0', 4, 1), ('.', 4, 2), ('=', 4, 3), ('+', 4, 4),
('sin', 5, 0), ('cos', 5, 1), ('tan', 5, 2), ('exp', 5, 3), ('log', 5, 4),
('ln', 6, 0), ('factorial', 6, 1)
]
for (text, row, column) in buttons:
button = tk.Button(self, text=text, command=lambda t=text: self.on_click(t))
button.grid(row=row, column=column)
def on_click(self, text):
if text == '=':
try:
expression = self.result_var.get()
result = eval(expression, {'__builtins__': None}, {
'sqrt': math.sqrt,
'sin': lambda x: math.sin(math.radians(x)),
'cos': lambda x: math.cos(math.radians(x)),
'tan': lambda x: math.tan(math.radians(x)),
'exp': math.exp,
'log': math.log10,
'ln': math.log,
'factorial': math.factorial
})
self.result_var.set(result)
except Exception as e:
self.result_var.set("エラー")
elif text == 'AC':
self.result_var.set("")
elif text in ('sqrt', 'sin', 'cos', 'tan', 'exp', 'log', 'ln', 'factorial'):
self.result_var.set(f"{text}(")
else:
current_text = self.result_var.get()
self.result_var.set(current_text + text)
if __name__ == "__main__":
app = CalculatorApp()
app.mainloop()

題材がありふれた内容だったせいもありますが、ChatGPTがどのくらいの能力を持ち合わせているのか、非常に興味があります。そのためにはどのような質問を与えるかが重要になって来ますね。日頃使わない?脳みそを使う必要がありそうです。いろいろChatGPTを試せる質問を考えて行きたいと思います。加えて、自分の生活、仕事が楽になるようなChatGPTの使い方を考えて行きたいと思います。