Tachyon Text Toolkit Python GUI

👤 Sharing: AI
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog, messagebox
import re
import random

class TextToolkitApp:
    def __init__(self, master):
        self.master = master
        master.title("Tachyon Text Toolkit")

        self.text_area = tk.Text(master, wrap=tk.WORD, undo=True)
        self.text_area.pack(expand=True, fill=tk.BOTH)

        self.menu_bar = tk.Menu(master)
        self.file_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.file_menu.add_command(label="Open", command=self.open_file)
        self.file_menu.add_command(label="Save", command=self.save_file)
        self.file_menu.add_separator()
        self.file_menu.add_command(label="Exit", command=master.quit)
        self.menu_bar.add_cascade(label="File", menu=self.file_menu)

        self.edit_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.edit_menu.add_command(label="Cut", command=lambda: self.text_area.event_generate("<<Cut>>"))
        self.edit_menu.add_command(label="Copy", command=lambda: self.text_area.event_generate("<<Copy>>"))
        self.edit_menu.add_command(label="Paste", command=lambda: self.text_area.event_generate("<<Paste>>"))
        self.edit_menu.add_command(label="Undo", command=self.text_area.edit_undo)
        self.edit_menu.add_command(label="Redo", command=self.text_area.edit_redo)
        self.menu_bar.add_cascade(label="Edit", menu=self.edit_menu)

        self.tools_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.tools_menu.add_command(label="Word Count", command=self.word_count)
        self.tools_menu.add_command(label="Character Count", command=self.character_count)
        self.tools_menu.add_command(label="Reverse Text", command=self.reverse_text)
        self.tools_menu.add_command(label="Shuffle Lines", command=self.shuffle_lines)
        self.tools_menu.add_command(label="Remove Duplicate Lines", command=self.remove_duplicate_lines)
        self.tools_menu.add_command(label="Sort Lines", command=self.sort_lines)
        self.tools_menu.add_command(label="Find and Replace", command=self.find_and_replace)
        self.menu_bar.add_cascade(label="Tools", menu=self.tools_menu)

        self.help_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.help_menu.add_command(label="About", command=self.show_about)
        self.menu_bar.add_cascade(label="Help", menu=self.help_menu)

        master.config(menu=self.menu_bar)

    def open_file(self):
        filepath = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt"), ("All Files", "*")])
        if filepath:
            try:
                with open(filepath, "r") as f:
                    content = f.read()
                    self.text_area.delete("1.0", tk.END)
                    self.text_area.insert(tk.END, content)
            except Exception as e:
                messagebox.showerror("Error", f"Could not open file:\n{e}")

    def save_file(self):
        filepath = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt"), ("All Files", "*")])
        if filepath:
            try:
                with open(filepath, "w") as f:
                    content = self.text_area.get("1.0", tk.END)
                    f.write(content)
            except Exception as e:
                messagebox.showerror("Error", f"Could not save file:\n{e}")

    def word_count(self):
        text = self.text_area.get("1.0", tk.END)
        words = re.findall(r'\b\w+\b', text.lower())
        messagebox.showinfo("Word Count", f"Word Count: {len(words)}")

    def character_count(self):
        text = self.text_area.get("1.0", tk.END)
        messagebox.showinfo("Character Count", f"Character Count: {len(text)}")

    def reverse_text(self):
        text = self.text_area.get("1.0", tk.END)
        reversed_text = text[::-1]
        self.text_area.delete("1.0", tk.END)
        self.text_area.insert(tk.END, reversed_text)

    def shuffle_lines(self):
        text = self.text_area.get("1.0", tk.END)
        lines = text.splitlines()
        random.shuffle(lines)
        shuffled_text = "\n".join(lines)
        self.text_area.delete("1.0", tk.END)
        self.text_area.insert(tk.END, shuffled_text)

    def remove_duplicate_lines(self):
        text = self.text_area.get("1.0", tk.END)
        lines = text.splitlines()
        unique_lines = list(dict.fromkeys(lines))
        unique_text = "\n".join(unique_lines)
        self.text_area.delete("1.0", tk.END)
        self.text_area.insert(tk.END, unique_text)

    def sort_lines(self):
        text = self.text_area.get("1.0", tk.END)
        lines = text.splitlines()
        lines.sort()
        sorted_text = "\n".join(lines)
        self.text_area.delete("1.0", tk.END)
        self.text_area.insert(tk.END, sorted_text)

    def find_and_replace(self):
        FindReplaceDialog(self.master, self.text_area)

    def show_about(self):
        AboutDialog(self.master)


class FindReplaceDialog(tk.Toplevel):
    def __init__(self, parent, text_area):
        super().__init__(parent)
        self.text_area = text_area
        self.title("Find and Replace")
        self.geometry("300x150")

        self.find_label = tk.Label(self, text="Find:")
        self.find_label.grid(row=0, column=0, padx=5, pady=5)
        self.find_entry = tk.Entry(self, width=25)
        self.find_entry.grid(row=0, column=1, padx=5, pady=5)

        self.replace_label = tk.Label(self, text="Replace:")
        self.replace_label.grid(row=1, column=0, padx=5, pady=5)
        self.replace_entry = tk.Entry(self, width=25)
        self.replace_entry.grid(row=1, column=1, padx=5, pady=5)

        self.find_button = tk.Button(self, text="Find and Replace", command=self.find_replace)
        self.find_button.grid(row=2, column=0, columnspan=2, padx=5, pady=5)

    def find_replace(self):
        find_text = self.find_entry.get()
        replace_text = self.replace_entry.get()
        text = self.text_area.get("1.0", tk.END)
        new_text = text.replace(find_text, replace_text)
        self.text_area.delete("1.0", tk.END)
        self.text_area.insert(tk.END, new_text)
        self.destroy()


class AboutDialog(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)
        self.title("About Tachyon Text Toolkit")
        self.geometry("300x200")

        about_text = """Tachyon Text Toolkit is a versatile text manipulation tool.

It provides a range of features for text editing, including:
- Opening and saving files
- Cutting, copying, and pasting text
- Word and character counts
- Reversing text
- Shuffling lines
- Removing duplicate lines
- Sorting lines
- Find and Replace

Developed with Python and Tkinter."

        about_label = tk.Label(self, text=about_text, justify=tk.LEFT)
        about_label.pack(padx=10, pady=10)

        ok_button = tk.Button(self, text="OK", command=self.destroy)
        ok_button.pack(pady=5)



root = tk.Tk()
app = TextToolkitApp(root)
root.mainloop()
👁️ Viewed: 5

Comments