From e39914244c045bb71a078709f6cd241f3fcfed91 Mon Sep 17 00:00:00 2001 From: sleepypeanut Date: Tue, 30 Jan 2024 10:37:08 -0600 Subject: [PATCH] GUI update and README updated to reflect changes. --- JSONcombiner.py | 75 +++++++++++++++++++++++++++++++++++------------- README.md | 9 ++++-- image.png | Bin 0 -> 9506 bytes 3 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 image.png diff --git a/JSONcombiner.py b/JSONcombiner.py index 925d856..c175a5a 100644 --- a/JSONcombiner.py +++ b/JSONcombiner.py @@ -1,29 +1,64 @@ -#JSONCombiner.py -#if running twice in same day, make sure to - import os import json from datetime import datetime +import tkinter as tk +from tkinter import filedialog +from tkinter import ttk +from ttkthemes import ThemedStyle + +class JSONCombinerGUI: + def __init__(self, master): + self.master = master + self.master.title("JSON Combiner") + self.master.geometry("500x200") + + self.style = ThemedStyle(self.master) + self.style.set_theme("plastik") # You can choose different themes + + self.folder_path = tk.StringVar() + self.output_file = tk.StringVar() + + ttk.Label(master, text="Select Folder:").grid(row=0, column=0, pady=10, padx=10, sticky="w") + ttk.Entry(master, textvariable=self.folder_path, width=30).grid(row=0, column=1, pady=10, padx=10, sticky="w") + ttk.Button(master, text="Browse", command=self.browse_folder).grid(row=0, column=2, pady=10, padx=10, sticky="w") + + ttk.Label(master, text="Output File:").grid(row=1, column=0, pady=10, padx=10, sticky="w") + ttk.Entry(master, textvariable=self.output_file, width=30).grid(row=1, column=1, pady=10, padx=10, sticky="w") + ttk.Button(master, text="Save As", command=self.save_as).grid(row=1, column=2, pady=10, padx=10, sticky="w") + + ttk.Button(master, text="Combine JSON", command=self.combine_json).grid(row=2, column=1, pady=20, padx=10, sticky="ew") + + def browse_folder(self): + folder_selected = filedialog.askdirectory() + self.folder_path.set(folder_selected) + + def save_as(self): + file_selected = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")]) + self.output_file.set(file_selected) + + def combine_json(self): + folder_path = self.folder_path.get() + + if not os.path.exists(folder_path): + tk.messagebox.showerror("Error", "Selected folder does not exist.") + return -folder_path = "Files" + files = os.listdir(folder_path) + python_objects = [] -# List all files in the folder -files = os.listdir("Files") + for file_name in files: + if os.path.isfile(os.path.join(folder_path, file_name)) and file_name.endswith('.json'): + with open(os.path.join(folder_path, file_name), 'r') as file: + python_objects.append(json.load(file)) -python_objects = [] + output_file = self.output_file.get() or f"combined_{datetime.now().strftime('%Y-%m-%d')}.json" + with open(output_file, "w") as f: + json.dump(python_objects, f, indent=4) -# Loop through each file -for file_name in files: - # Check if it's a file (not a subdirectory) - if os.path.isfile(os.path.join(folder_path, file_name)) and file_name.endswith('.json'): - # Process the file as needed - print(f"Processing file: {file_name}") - - # Example: Read the content of the file - with open(os.path.join(folder_path, file_name), 'r') as file: - python_objects.append(json.load(file)) + tk.messagebox.showinfo("Success", "JSON files combined successfully.") -# Dump all the Python objects into a single JSON file. -with open(os.path.join(f"combined_{datetime.now().strftime('%Y-%m-%d')}.json"), "w") as f: - json.dump(python_objects, f, indent=4) \ No newline at end of file +if __name__ == "__main__": + root = tk.Tk() + app = JSONCombinerGUI(root) + root.mainloop() diff --git a/README.md b/README.md index d5521a7..c79df25 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ Combine Multiple JSON Files of the same structure ## Instructions: -Put whatever JSON files that need to be combined into the **Files** folder, and run the script. +Put whatever JSON files that need to be appended to one another into a folder of their own. + +Run the JSONCombiner.py script to pull up the python GUI. Optionally, convert the script to an .exe file for long-term use. + +![Python GUI with selection areas for JSON files and Final File nmae](image.png) + +From the Python GUI, select the location of the folder contianing all files and set a name for the combination file, which outputs into the JSONCombiner Folder. -The Script should output a file named "combined_[date].json" diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..40ee9542aed5280f393fcac15faff4939a18d22e GIT binary patch literal 9506 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 izvVvM{PbcKR9Q5#br*qHto&aS;Nm%_v(?_v* literal 0 HcmV?d00001