ruby/TKは触ったことありますが、
python/TKは触ったことなかったので
個人的にはQtよりTkのほうが好きです
いざ作ろうと思うと調べるのがめんどくさくなったのでざっくりChatGPTに作ってもらうことにしました。
私の曖昧でへたくそな日本語でもそれなりのものを返してくるChatGPTまじすごい
ChatGPT質問.
(1)
下記ようなGUIをpython/Tkで作成してください
ボタンを押すと
[テキストボックス1]
[テキストエリア2]
の内容を[テキストボックス3]のファイル名で保存
GUIレイアウトイメージ
value1=[テキストボックス1]
value2=[テキストエリア2]
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()