import tkinter as tk
from tkinter import filedialog, messagebox
# Initialize the main application window
app = tk.Tk()
app.title("Modern Text Editor")
app.geometry("800x600")
# Set modern styles
app.configure(bg="#2c3e50")
font_style = ("Helvetica", 14)
text_bg = "#ecf0f1"
text_fg = "#2c3e50"
# Text widget for content editing
text_area = tk.Text(app, wrap=tk.WORD, font=font_style, bg=text_bg, fg=text_fg, undo=True)
text_area.pack(expand=1, fill=tk.BOTH, padx=10, pady=10)
# Current file path
current_file = None
# Functions
def new_file():
global current_file
current_file = None
text_area.delete(1.0, tk.END)
app.title("New File - Modern Text Editor")
def open_file():
global current_file
file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")])
if file_path:
try:
with open(file_path, "r") as file:
content = file.read()
text_area.delete(1.0, tk.END)
text_area.insert(tk.END, content)
current_file = file_path
app.title(f"{file_path} - Modern Text Editor")
except Exception as e:
messagebox.showerror("Error", f"Could not open file: {e}")
def save_file():
global current_file
if current_file:
try:
with open(current_file, "w") as file:
file.write(text_area.get(1.0, tk.END))
messagebox.showinfo("Success", "File saved successfully!")
except Exception as e:
messagebox.showerror("Error", f"Could not save file: {e}")
else:
save_as_file()
def save_as_file():
global current_file
file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")])
if file_path:
try:
with open(file_path, "w") as file:
file.write(text_area.get(1.0, tk.END))
current_file = file_path
app.title(f"{file_path} - Modern Text Editor")
messagebox.showinfo("Success", "File saved successfully!")
except Exception as e:
messagebox.showerror("Error", f"Could not save file: {e}")
def exit_app():
if messagebox.askyesno("Exit", "Do you want to save changes before exiting?"):
save_file()
app.destroy()
# Menu bar
menu_bar = tk.Menu(app, bg="#34495e", fg="#ecf0f1", activebackground="#16a085", activeforeground="white")
# File menu
file_menu = tk.Menu(menu_bar, tearoff=0, bg="#34495e", fg="white", activebackground="#16a085", activeforeground="white")
file_menu.add_command(label="New", command=new_file)
file_menu.add_command(label="Open", command=open_file)
file_menu.add_command(label="Save", command=save_file)
file_menu.add_command(label="Save As", command=save_as_file)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=exit_app)
menu_bar.add_cascade(label="File", menu=file_menu)
# Edit menu
edit_menu = tk.Menu(menu_bar, tearoff=0, bg="#34495e", fg="white", activebackground="#16a085", activeforeground="white")
edit_menu.add_command(label="Undo", command=text_area.edit_undo)
edit_menu.add_command(label="Redo", command=text_area.edit_redo)
edit_menu.add_separator()
edit_menu.add_command(label="Cut", command=lambda: app.focus_get().event_generate("<>"))
edit_menu.add_command(label="Copy", command=lambda: app.focus_get().event_generate("<>"))
edit_menu.add_command(label="Paste", command=lambda: app.focus_get().event_generate("<>"))
menu_bar.add_cascade(label="Edit", menu=edit_menu)
# Add menu bar to the application
app.config(menu=menu_bar)
# Run the application
app.mainloop()
.button-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px;
}
.btn {
padding: 15px 30px;
margin: 10px;
font-size: 16px;
font-weight: bold;
color: white;
border: none;
border-radius: 5px;
box-shadow: 0 5px 0 rgba(0, 0, 0, 0.2), 0 6px 15px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
transform: perspective(500px) translateZ(0);
cursor: pointer;
}
.btn:hover {
transform: perspective(500px) translateZ(20px);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.4), 0 10px 20px rgba(0, 0, 0, 0.2);
}
/* Animations */
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
@keyframes rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes slide {
0% { transform: translateX(0); }
100% { transform: translateX(100px); }
}
@keyframes fade {
0% { opacity: 1; }
100% { opacity: 0; }
}
@keyframes zoom {
0% { transform: scale(1); }
100% { transform: scale(1.2); }
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
@keyframes swing {
0%, 100% { transform: rotate(0deg); }
50% { transform: rotate(15deg); }
}
@keyframes flip {
0% { transform: rotateX(0deg); }
100% { transform: rotateX(360deg); }
}
@keyframes jump {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-30px); }
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
@keyframes expand {
0% { transform: scale(1); }
100% { transform: scale(1.5); }
}
@keyframes shrink {
0% { transform: scale(1); }
100% { transform: scale(0.5); }
}
@keyframes spin {
0% { transform: rotateY(0deg); }
100% { transform: rotateY(360deg); }
}
@keyframes wobble {
0%, 100% { transform: rotate(0deg); }
25% { transform: rotate(10deg); }
75% { transform: rotate(-10deg); }
}
@keyframes vibrate {
0%, 100% { transform: translateX(0); }
50% { transform: translateX(3px); }
}
@keyframes pop {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.2); }
}
@keyframes glow {
0% { box-shadow: 0 0 10px white; }
100% { box-shadow: 0 0 30px white; }
}
@keyframes rotateX {
0% { transform: rotateX(0deg); }
100% { transform: rotateX(360deg); }
}
@keyframes rotateY {
0% { transform: rotateY(0deg); }
100% { transform: rotateY(360deg); }
}
/* Button-specific animations */
.bounce:hover { animation: bounce 0.5s ease infinite; }
.rotate:hover { animation: rotate 1s linear infinite; }
.slide:hover { animation: slide 1s ease; }
.fade:hover { animation: fade 1s ease; }
.zoom:hover { animation: zoom 0.5s ease; }
.pulse:hover { animation: pulse 1s ease infinite; }
.swing:hover { animation: swing 0.5s ease infinite; }
.flip:hover { animation: flip 1s ease infinite; }
.jump:hover { animation: jump 0.5s ease infinite; }
.shake:hover { animation: shake 0.5s ease infinite; }
.expand:hover { animation: expand 0.5s ease; }
.shrink:hover { animation: shrink 0.5s ease; }
.spin:hover { animation: spin 1s ease infinite; }
.wobble:hover { animation: wobble 1s ease infinite; }
.vibrate:hover { animation: vibrate 0.5s ease infinite; }
.pop:hover { animation: pop 0.5s ease infinite; }
.glow:hover { animation: glow 1s ease infinite; }
.rotateX:hover { animation: rotateX 1s ease infinite; }
.rotateY:hover { animation: rotateY 1s ease infinite; }