python/TKのひな形をChatGPTと対話しながら作る


ruby/TKは触ったことありますが、
python/TKは触ったことなかったので
個人的にはQtよりTkのほうが好きです

いざ作ろうと思うと調べるのがめんどくさくなったのでざっくりChatGPTに作ってもらうことにしました。
私の曖昧でへたくそな日本語でもそれなりのものを返してくるChatGPTまじすごい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638856/9e087d92-139c-bd07-5273-f38d084a6b4a.png)
```ChatGPT質問.
(1)
下記ようなGUIをpython/Tkで作成してください
ボタンを押すと
[テキストボックス１]
[テキストエリア２]
の内容を[テキストボックス3]のファイル名で保存

GUIレイアウトイメージ
value1=[テキストボックス１]
value2=[テキストエリア２]
output=[テキストボックス3][ボタン(save)]
(2)
保存するフォーマットは、pythonで読める形式でお願いします
(3)
保存したjson読み込んでGUIに表示する機能も追加してください。input:[テキストボックス][ボタン read] を追加
(4)
レイアウト作成部分はclass 読み込み、書き込みの関数はメソッドにしてください
(5)
output input のテキストボックスの横に[参照ボタン]を追加してファイルダイアログが開くようにして、そこからoutput,inputのファイルを指定できるようにしてください
(6)
value3としてプルダウン形式を追加してください、選択できる値は[ "--","AA","BB","CC"]です
(7)
input,outpuそれぞれのlabelとテキストボックスと参照ボタンと保存読み込みボタンは　Frameでまとめてください
(8)
Save、Readボタンが2行目になっていますが、1行でまとめてよいです。またvalue1,value2,value3もそれぞれのテキストボックス、テキストエリア、プルダウンとFrameでまとめてください
(9)
output:のテキストボックス参照ボタンを無くして、saveボタンからダイアログを開いてダイアログからjsonを保存できますか
(10)
output:のLabel、テキストボックスが不要になったので削除してくだい、
inputfileのLabel、テキストボックス、参照も削除して、Readボタンから直接保存できるようにしてください
(11)
各frameを左寄せにしてください
テキストボックスやテキストボックスの大きさをWindowの幅に簡単に合わせられるならお願いします
テキストエリアにスクロールバーを追加してください
```

```pytkGUIsample.py
import tkinter as tk
from tkinter import messagebox, filedialog, Scrollbar
import json

class TextSaverApp:
    def __init__(self, master):
        self.master = master
        master.title("テキスト保存 GUI")

        # value1用のフレーム
        value1_frame = tk.Frame(master)
        value1_frame.grid(row=0, padx=10, pady=10, sticky="w")

        tk.Label(value1_frame, text="value1:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
        self.entry1 = tk.Entry(value1_frame, width=50)
        self.entry1.grid(row=0, column=1, padx=5, pady=5)

        # value2用のフレーム
        value2_frame = tk.Frame(master)
        value2_frame.grid(row=1, padx=10, pady=10, sticky="w")

        tk.Label(value2_frame, text="value2:").grid(row=0, column=0, padx=5, pady=5, sticky="ne")
        
        # テキストエリアとスクロールバーを追加
        self.text_area = tk.Text(value2_frame, height=5, width=50)
        self.text_area.grid(row=0, column=1, padx=5, pady=5)
        
        scrollbar = Scrollbar(value2_frame, command=self.text_area.yview)
        scrollbar.grid(row=0, column=2, sticky="ns")
        self.text_area['yscrollcommand'] = scrollbar.set

        # value3用のフレーム
        value3_frame = tk.Frame(master)
        value3_frame.grid(row=2, padx=10, pady=10, sticky="w")

        tk.Label(value3_frame, text="value3:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
        self.value3_var = tk.StringVar(master)
        self.value3_var.set("--")  # デフォルト値
        self.value3_menu = tk.OptionMenu(value3_frame, self.value3_var, "--", "AA", "BB", "CC")
        self.value3_menu.grid(row=0, column=1, padx=5, pady=5, sticky="w")

        # SaveとReadボタンを同じ行に配置
        button_frame = tk.Frame(master)
        button_frame.grid(row=3, columnspan=2, padx=10, pady=10, sticky="w")

        save_button = tk.Button(button_frame, text="Save", command=self.save_to_file)
        save_button.grid(row=0, column=0, padx=5, pady=5)

        read_button = tk.Button(button_frame, text="Read", command=self.read_from_file)
        read_button.grid(row=0, column=1, padx=5, pady=5)

    def save_to_file(self):
        value1 = self.entry1.get()
        value2 = self.text_area.get("1.0", tk.END).strip()
        value3 = self.value3_var.get()
        
        filename = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json"), ("All files", "*.*")])
        if not filename:
            return
        
        data = {
            "value1": value1,
            "value2": value2,
            "value3": value3
        }
        
        try:
            with open(filename, 'w', encoding='utf-8') as file:
                json.dump(data, file, ensure_ascii=False, indent=4)
            messagebox.showinfo("Success", f"{filename} に保存しました。")
        except Exception as e:
            messagebox.showerror("Error", f"ファイル保存中にエラーが発生しました:\n{e}")

    def read_from_file(self):
        filename = filedialog.askopenfilename(filetypes=[("JSON files", "*.json"), ("All files", "*.*")])
        if not filename:
            return
        
        try:
            with open(filename, 'r', encoding='utf-8') as file:
                data = json.load(file)
                self.entry1.delete(0, tk.END)
                self.entry1.insert(0, data.get("value1", ""))
                self.text_area.delete("1.0", tk.END)
                self.text_area.insert("1.0", data.get("value2", ""))
                self.value3_var.set(data.get("value3", "--"))
            messagebox.showinfo("Success", f"{filename} を読み込みました。")
        except Exception as e:
            messagebox.showerror("Error", f"ファイル読み込み中にエラーが発生しました:\n{e}")

if __name__ == "__main__":
    root = tk.Tk()
    #root.geometry("600x400")  # ウィンドウサイズの設定
    app = TextSaverApp(root)
    root.mainloop()
```