svg-processor/gui/file_handler.py
2025-05-16 18:15:31 +04:00

174 lines
5.6 KiB
Python

import tkinter as tk
from tkinter import filedialog, messagebox
import os
import json
class FileHandler:
"""Handler for file operations."""
def __init__(self, root):
"""
Initialize the file handler.
Args:
root: The Tkinter root window.
"""
self.root = root
def browse_file(self, title="Select File", filetypes=None):
"""Open a file dialog to select a file.
Args:
title (str): The title of the file dialog.
filetypes (list): List of file type tuples (description, pattern).
Returns:
str: The selected file path, or None if no file was selected.
"""
if filetypes is None:
filetypes = [("All files", "*.*")]
file_path = filedialog.askopenfilename(
title=title,
filetypes=filetypes
)
return file_path if file_path else None
def save_file(self, title="Save File", filetypes=None, defaultextension="", initialfile=""):
"""Open a file dialog to save a file.
Args:
title (str): The title of the file dialog.
filetypes (list): List of file type tuples (description, pattern).
defaultextension (str): Default file extension.
initialfile (str): The initial filename to suggest.
Returns:
str: The selected file path, or None if no file was selected.
"""
if filetypes is None:
filetypes = [("All files", "*.*")]
file_path = filedialog.asksaveasfilename(
title=title,
filetypes=filetypes,
defaultextension=defaultextension,
initialfile=initialfile
)
return file_path if file_path else None
def save_text_to_file(self, text, title="Save Text", filetypes=None, defaultextension=".txt"):
"""Save text to a file.
Args:
text (str): The text to save.
title (str): The title of the file dialog.
filetypes (list): List of file type tuples (description, pattern).
defaultextension (str): Default file extension.
Returns:
bool: True if the file was saved successfully, False otherwise.
"""
file_path = self.save_file(title, filetypes, defaultextension)
if file_path:
try:
with open(file_path, 'w') as f:
f.write(text)
return True
except Exception as e:
messagebox.showerror("Error", f"Failed to save file: {str(e)}")
return False
def save_json_to_file(self, data, title="Save JSON", filetypes=None, defaultextension=".json"):
"""Save JSON data to a file.
Args:
data: The JSON data to save.
title (str): The title of the file dialog.
filetypes (list): List of file type tuples (description, pattern).
defaultextension (str): Default file extension.
Returns:
bool: True if the file was saved successfully, False otherwise.
"""
file_path = self.save_file(title, filetypes, defaultextension)
if file_path:
try:
with open(file_path, 'w') as f:
json.dump(data, f, indent=4)
return True
except Exception as e:
messagebox.showerror("Error", f"Failed to save file: {str(e)}")
return False
def load_json_from_file(self, title="Load JSON", filetypes=None):
"""Load JSON data from a file.
Args:
title (str): The title of the file dialog.
filetypes (list): List of file type tuples (description, pattern).
Returns:
dict: The loaded JSON data, or None if no file was selected or loading failed.
"""
if filetypes is None:
filetypes = [("JSON files", "*.json"), ("All files", "*.*")]
file_path = self.browse_file(title, filetypes)
if file_path:
try:
with open(file_path, 'r') as f:
return json.load(f)
except Exception as e:
messagebox.showerror("Error", f"Failed to load file: {str(e)}")
return None
# Example usage (for testing)
if __name__ == '__main__':
root = tk.Tk()
root.title("File Handler Test")
root.geometry("400x300")
# Create file handler
file_handler = FileHandler(root)
# Test buttons
def test_browse():
file_path = file_handler.browse_file(
title="Select a file",
filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
)
if file_path:
print(f"Selected file: {file_path}")
def test_save():
success = file_handler.save_text_to_file(
"Test text content",
title="Save text file",
filetypes=[("Text files", "*.txt")]
)
if success:
print("File saved successfully")
def test_json():
data = {"test": "data", "number": 123}
success = file_handler.save_json_to_file(
data,
title="Save JSON file"
)
if success:
print("JSON file saved successfully")
ttk.Button(root, text="Browse File", command=test_browse).pack(pady=5)
ttk.Button(root, text="Save Text", command=test_save).pack(pady=5)
ttk.Button(root, text="Save JSON", command=test_json).pack(pady=5)
root.mainloop()