From 2c0d82f28b58d3544a9206c3cddfe100b3e7a89a Mon Sep 17 00:00:00 2001 From: Aiden Sorabji Date: Tue, 4 Jun 2024 12:17:52 -0600 Subject: [PATCH 1/3] New files --- Word.py | 657 ++++++++++++++++++++++++++++++++++++++++++++++++++ checkmark.png | Bin 0 -> 12052 bytes copy.png | Bin 0 -> 5393 bytes paste.png | Bin 0 -> 8731 bytes 4 files changed, 657 insertions(+) create mode 100644 Word.py create mode 100644 checkmark.png create mode 100644 copy.png create mode 100644 paste.png diff --git a/Word.py b/Word.py new file mode 100644 index 0000000..16d91e5 --- /dev/null +++ b/Word.py @@ -0,0 +1,657 @@ +# WHAT TO ADD NEXT +# +# - Intro Screen (New File, Load File, Keep the other buttons) Then turn in to actual editor + +# Modules +import customtkinter +import os +from PIL import Image +from CTkMessagebox import CTkMessagebox + +# Tag Stuff +def new_tag_config(self, tagName, **kwargs): + return self._textbox.tag_config(tagName, **kwargs) + +customtkinter.CTkTextbox.tag_config = new_tag_config + +# Classifying Stuff +global is_bolded, is_underlined, is_striked +current_font_size = 17 +current_font = "SF Display" +textbox = None +path_to_folder = None +main_window = None +cut_button = None +word_count = "Words: 0" +is_bolded = False +is_underlined = False +is_striked = False +windows_opened = 1 + +# Icons +checkmark_icon = customtkinter.CTkImage(dark_image=Image.open("checkmark.png"), + size=(15, 15)) +copy_icon = customtkinter.CTkImage(dark_image=Image.open("copy.png"), + size=(19, 19)) +paste_icon = customtkinter.CTkImage(dark_image=Image.open("paste.png"), + size=(19, 19)) + +# Definitions +def open_file(): + checkmark_icon = customtkinter.CTkImage(dark_image=Image.open("checkmark.png"), + size=(15, 15)) + copy_icon = customtkinter.CTkImage(dark_image=Image.open("copy.png"), + size=(19, 19)) + paste_icon = customtkinter.CTkImage(dark_image=Image.open("paste.png"), + size=(19, 19)) + + +def show_error(): + # Show some error message + CTkMessagebox( + title="Error", message="No Selection Chosen!", icon="cancel", option_1="Ok") + + +def cut_variable(): + global textbox, main_window, cut_button + + def cut_variable(): + text_selected = textbox.get( + customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + main_window.clipboard_append(text_selected) + textbox.delete(customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + main_window.update() + return cut_button + + if cut_button: # Check if cut_button exists + cut_button.destroy() # Destroy the button if it exists + + cut_button = customtkinter.CTkButton(main_window, + fg_color='#4e4f52', + corner_radius=8, + text="Cut?", + border_width=1, + border_color="#4e5255", + hover_color="#414245", + bg_color="#2b2b2b", + width=60, + height=25, + command=cut_variable) + cut_button.place(x=4, + y=572) + + +def start_textbox(): + global main_window, textbox + textbox_frame = customtkinter.CTkFrame(main_window, + width=900, + height=472, + border_width=2, + corner_radius=0) + textbox_frame.place(x=0, + y=98) + + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + textbox = customtkinter.CTkTextbox(textbox_frame, + width=900, + height=470, + font=customtkinter.CTkFont(current_font, size=current_font_size)) + textbox.grid(sticky="n") + + +def new_file_prompt(): + global path_to_folder, textbox, path + file_window = customtkinter.CTk() + file_window.title("Create New File") + file_window.geometry("300x153") + file_window.attributes('-topmost', True) + + # --------------------------- Labels and Stuff --------------------------- # + + label1 = customtkinter.CTkLabel(file_window, + text="Filename", + bg_color="#242424", + font=customtkinter.CTkFont(size=15, + weight="bold")) + label1.pack(padx=10, + pady=3, + side="top", + anchor="nw") + + label2 = customtkinter.CTkLabel(file_window, + text="Custom Path", + bg_color="#242424", + font=customtkinter.CTkFont(size=15, + weight="bold")) + label2.pack(padx=10, + pady=7, + side="top", + anchor="nw") + + label3 = customtkinter.CTkLabel(file_window, + text="All changes will be saved", + bg_color="#242424", + font=customtkinter.CTkFont("italic", size=10)) + label3.place(x=10, + y=121) + + # -------------------------- Buttons and Stuff -------------------------- # + + file_extension = ".txt" + + filename = customtkinter.CTkEntry(file_window, + font=customtkinter.CTkFont(size=13), + height=9, + width=100, + placeholder_text="filename") + filename.place(x=130, + y=5) + + filextension_var = customtkinter.StringVar(value=".txt") + + def file_extension_variable(choice): + file_extension = str(choice) + print(file_extension) + return file_extension + + filextension = customtkinter.CTkOptionMenu(file_window, + values=[".txt", ".doc"], + variable=filextension_var, + width=60, + height=23, + bg_color="#242323", + command=file_extension_variable) + filextension.place(x=235, + y=5) + + custompath = 0 + + choice_var = customtkinter.IntVar() + + path_to_folder = None + + def variable_no(): + global custompath, path_to_folder + if path_to_folder is not None: + path_to_folder.destroy() + custompath = 0 + return custompath + + no_button = customtkinter.CTkRadioButton(file_window, + bg_color="#242323", + width=7, + height=3, + text="No", + font=customtkinter.CTkFont( + size=12), + variable=choice_var, + value=1, + command=variable_no) + no_button.place(x=245, + y=45) + + def variable_yes(): + global custompath, path_to_folder + path_to_folder = customtkinter.CTkEntry(file_window, + font=customtkinter.CTkFont( + size=13), + height=9, + width=110, + placeholder_text="/path/to/folder") + path_to_folder.place(x=184, + y=75) + custompath = 1 + return path_to_folder, custompath + + yes_button = customtkinter.CTkRadioButton(file_window, + bg_color="#242323", + width=7, + height=3, + text="Yes", + font=customtkinter.CTkFont( + size=12), + variable=choice_var, + value=2, + command=variable_yes) + yes_button.place(x=185, + y=45) + + def create_file(file_extension, content, custompath): + global path, textbox + if custompath == 1: + global path_to_folder + filename_and_extension = (filename.get()) + file_extension + path = str(path_to_folder.get()) + "/" + \ + str(filename_and_extension) + with open(path, 'w') as file_: + file_.write(content) + file_.close() + file_window.destroy() + elif custompath == 0: + current_dir = os.getcwd() + filename_and_extension = (filename.get()) + file_extension + path1 = str(current_dir) + "/" + "Written_Works" + + if not os.path.exists(path1): + os.makedirs(path1) + if os.path.exists(path1): + pass + + path = path1 + "/" + str(filename_and_extension) + with open(path, 'w') as file_: + file_.write(content) + file_.close() + file_window.destroy() + + # Inside save_textbox_prompt function + + def create_file_callback(): + global path_to_folder, textbox, path + content = textbox.get("1.0", "end-1c") # Get content from textbox + create_file(file_extension, content, custompath) + + create_file_button = customtkinter.CTkButton(file_window, + bg_color="#242323", + width=90, + height=20, + text="Create File", + command=create_file_callback) + create_file_button.place(x=205, + y=125) + + file_window.mainloop() + + +def save_file_callback(): + global path, textbox + if path: # Check if path is not None + with open(path, 'w') as file_: + content = textbox.get("1.0", "end-1c") # Get content from textbox + file_.write(content) + file_.close() + + +def constant_update(): + global textbox, word_counter_label, main_window + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + # ---------------- Update Textbox and Word Counter Label ------------------- # + text = textbox.get("1.0", "end-1c") + word_count_before = len(text.split()) + word_count = "Words:", str(word_count_before) + word_counter_label.configure(text=word_count) + word_counter_label.update() + + # ------------------------- Check for Highlight ---------------------------- # + if textbox.tag_ranges("sel"): + # Create Buttons that will have different functions + cut_variable() + pass + if not textbox.tag_ranges('sel'): + if cut_button: # Check if cut_button exists + cut_button.destroy() # Destroy the button if it exists + pass + # -------------------------- Update Everything ---------------------------- # + main_window.after(300, constant_update) + +# _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- Main -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ # +def main(): + global main_window, textbox, size_entry, change_size + main_window = customtkinter.CTk() + main_window.geometry("900x600") + main_window.title("Word") + main_window.resizable(False, False) + main_window._apply_appearance_mode("dark") + + def quitting(): + print("ye") + main_window.destory() + pygame.quit() + quit() + + main_window.bind('', + lambda event: textbox.delete("1.0", customtkinter.INSERT)) + main_window.bind('', + lambda event: textbox.delete("insert-1c wordstart", "insert")) + main_window.bind('', + lambda event: bold_function()) + main_window.bind('', + lambda event: underline_function()) + main_window.bind('', + lambda event: strikethrough_function()) + main_window.bind('', + lambda event: quitting()) + # ------------------- Top Part ------------------- # + top_frame = customtkinter.CTkFrame(main_window, + width=900, + height=99, + border_width=2, + corner_radius=1) + top_frame.pack(padx=0, + pady=0, + side="top") + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + new_file_button = customtkinter.CTkButton(main_window, + height=26, + width=150, + text="New File", + corner_radius=4, + border_width=1, + fg_color="#242424", + border_color="#333232", + bg_color="#2b2b2b", + font=customtkinter.CTkFont(size=14, + weight="bold"), + command=new_file_prompt) + new_file_button.place(x=5, + y=6) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + load_file_button = customtkinter.CTkButton(main_window, + height=26, + width=150, + text="Load File", + corner_radius=4, + border_width=1, + fg_color="#242424", + border_color="#333232", + bg_color="#2b2b2b", + font=customtkinter.CTkFont(size=14, + weight="bold")) + load_file_button.place(x=5, + y=36) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + save_file_button = customtkinter.CTkButton(main_window, + height=26, + width=150, + text="Save File", + corner_radius=4, + border_width=1, + fg_color="#242424", + border_color="#333232", + bg_color="#2b2b2b", + font=customtkinter.CTkFont(size=14, + weight="bold"), + command=save_file_callback) + save_file_button.place(x=5, + y=66) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + def clear_textbox(): + textbox.delete("1.0", "end") # Clear the textbox + + clear_textbox_text = """Clear +Texbox""" + + clear_textbox_button = customtkinter.CTkButton(main_window, + width=75, + height=42, + text=clear_textbox_text, + corner_radius=4, + border_width=1, + fg_color="#242424", + border_color="#333232", + bg_color="#2b2b2b", + hover_color="#135970", + font=customtkinter.CTkFont(size=12, + weight="bold"), + command=clear_textbox) + clear_textbox_button.place(x=159, + y=6) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + options_button = customtkinter.CTkButton(main_window, + width=75, + height=40, + text="Options", + corner_radius=4, + border_width=1, + fg_color="#242424", + border_color="#333232", + bg_color="#2b2b2b", + hover_color="#135970", + font=customtkinter.CTkFont(size=12, + weight="bold")) + options_button.place(x=159, + y=52) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + size_entry = customtkinter.CTkEntry(main_window, + height=23, + width=80, + placeholder_text=current_font_size, + font=customtkinter.CTkFont(size=13), + bg_color="#2b2b2b", + border_color='#555b5e', + placeholder_text_color="white", + corner_radius=4, + border_width=1) + size_entry.place(x=240, + y=7) + + def change_size(): + current_font_size = int(size_entry.get()) + if current_font_size > 450: + current_font_size = 450 + textbox.configure(state="normal") + + textbox.configure(font=(current_font, current_font_size)) + + size_entry_confirm = customtkinter.CTkButton(main_window, + fg_color='#353638', + width=23, + height=23, + corner_radius=3, + image=checkmark_icon, + border_width=1, + border_color='#4e5255', + background_corner_colors=[ + '#555b5e', '#353638', '#353638', '#555b5e'], + bg_color='#2b2b2b', + text="", + hover_color="#137022", + command=change_size) + size_entry_confirm.place(x=298, + y=7) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + def bold_function(): + global is_bolded + if is_bolded == False: + textbox.tag_add("bold", customtkinter.SEL_FIRST, + customtkinter.SEL_LAST) + textbox.tag_config("bold", font=customtkinter.CTkFont(current_font, + weight="bold", + size=(current_font_size + 0))) + is_bolded = True + elif is_bolded == True: + sel_first = textbox.index(customtkinter.SEL_FIRST) + sel_last = textbox.index(customtkinter.SEL_LAST) + textbox.tag_remove("bold", sel_first, sel_last) + is_bolded = False + + bold_button = customtkinter.CTkButton(main_window, + fg_color='#353638', + width=25, + height=25, + corner_radius=4, + text="B", + border_width=1, + font=customtkinter.CTkFont( + size=12, weight="bold"), + border_color="#4e5255", + hover_color="#136d70", + bg_color="#2b2b2b", + command=bold_function) + bold_button.place(x=240, + y=34) + + def underline_function(): + global is_underlined + if is_underlined == False: + textbox.tag_add("underline", customtkinter.SEL_FIRST, + customtkinter.SEL_LAST) + textbox.tag_config("underline", underline=True) + is_underlined = True + elif is_underlined == True: + textbox.tag_remove( + "underline", customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + textbox.tag_config("underline", font=customtkinter.CTkFont( + underline=False, size=current_font_size)) + is_underlined = False + + underline_button = customtkinter.CTkButton(main_window, + fg_color='#353638', + width=25, + height=25, + corner_radius=4, + text="U", + border_width=1, + font=customtkinter.CTkFont( + size=12, underline=True), + border_color="#4e5255", + hover_color="#136d70", + bg_color="#2b2b2b", + command=underline_function) + underline_button.place(x=269, + y=34) + + def strikethrough_function(): + global is_striked + if is_striked == False: + textbox.tag_add("strikethrough", + customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + textbox.tag_config("strikethrough", overstrike=True) + is_striked = True + elif is_striked == True: + textbox.tag_delete( + "strikethrough", customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + textbox.tag_config("strikethrough", font=customtkinter.CTkFont( + overstrike=False, size=current_font_size)) + is_striked = False + + strikethrough_button = customtkinter.CTkButton(main_window, + fg_color='#353638', + width=25, + height=25, + corner_radius=4, + text="S", + border_width=1, + font=customtkinter.CTkFont( + size=12, overstrike=True), + border_color="#4e5255", + hover_color="#136d70", + bg_color="#2b2b2b", + command=strikethrough_function) + strikethrough_button.place(x=298, + y=34) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + def copy_callback(): + if textbox.tag_ranges("sel"): + text_selected = textbox.get( + customtkinter.SEL_FIRST, customtkinter.SEL_LAST) + main_window.clipboard_append(text_selected) + main_window.update() + if not textbox.tag_ranges('sel'): + show_error() + pass + + copy_button = customtkinter.CTkButton(main_window, + fg_color='#353638', + corner_radius=4, + text="", + border_width=1, + border_color="#4e5255", + hover_color="#136d70", + bg_color="#2b2b2b", + width=39, + height=28, + image=copy_icon, + command=copy_callback) + copy_button.place(x=240, + y=63) + + def paste_callback(): + user_clipboard = main_window.clipboard_get() + curser_location = textbox.index(customtkinter.CURRENT) + textbox.insert(curser_location, user_clipboard) + + paste_button = customtkinter.CTkButton(main_window, + fg_color='#353638', + corner_radius=4, + text="", + border_width=1, + border_color="#4e5255", + hover_color="#136d70", + bg_color="#2b2b2b", + width=39, + height=28, + image=paste_icon, + command=paste_callback) + paste_button.place(x=284, + y=63) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + def font_callback(choice): + global textbox, main_window, current_font_size + if choice == "SF Display": + current_font = choice + elif choice == "Arial": + current_font = choice + elif choice == "Helvetica": + current_font = choice + elif choice == "Comic Sans MS": + current_font = choice + elif choice == "Times New Roman": + current_font = choice + elif choice == "Impact": + current_font = choice + + textbox.configure(state="normal") + textbox.configure(font=(current_font, current_font_size)) + font_menu.configure(font=(current_font, 12)) + return current_font + + font_menu = customtkinter.CTkOptionMenu(main_window, + fg_color='#353638', + height=23, + width=140, + dropdown_fg_color="#353638", + button_color="#353638", + font=customtkinter.CTkFont( + size=12), + bg_color="#2b2b2b", + corner_radius=4, + values=["SF Display", + "Arial", + "Helvetica", + "Comic Sans MS", + "Times New Roman", + "Impact"], + button_hover_color="#302f2f", + command=font_callback) + font_menu.place(x=332, + y=8) + # ------------------ Middle Part ----------------- # + start_textbox() + # ------------------- End Part ------------------- # + bottom_frame = customtkinter.CTkFrame(main_window, + width=900, + height=33, + border_width=1, + corner_radius=4) + bottom_frame.place(x=0, + y=569) + + global word_counter_label + word_counter_label = customtkinter.CTkLabel(main_window, + text=word_count, + font=customtkinter.CTkFont( + size=14), + bg_color="#2b2b2b", + text_color="#d4d4d4", + height=26) + word_counter_label.place(x=810, + y=570) + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- # + + # --------------- Constant Update --------------- # + constant_update() + + main_window.mainloop() + + +main() diff --git a/checkmark.png b/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..be79647d09459b4f76efad9cb11e6221cd755268 GIT binary patch literal 12052 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 literal 0 HcmV?d00001 diff --git a/copy.png b/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..e819040ecadffea63b2f6c6935b519853c6f7857 GIT binary patch literal 5393 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 literal 0 HcmV?d00001 diff --git a/paste.png b/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..b5437cd3b0e6be1dbe58b7c1c8b4aa4f59dd4733 GIT binary patch literal 8731 zcmZvCcQ{+``~NvfNW@BvO4W$a)+nM{wFR*{P_=3XEjrY$8YQtBYL}w5O10j!lAbY*=krepntV-vO)#t@LY(AV#P# z5&paZV$jL76TFR|R&`fOlT``#Ojppb^OAOX-38qXHJ3`nR-5%4>!VjAzVP9zg>h{7 zl3=sU{o(ZantnT9!+{^B*~M9fy`%1L;~yIO_L-JAY=#_eeX6VBe2i+qvo+wuahUpC z9W6kSUtC5$=U5J3ob@JC8k1B|8|GP|Nz>)#^8W;*Gku7Ko+ z@Go|3W&1!9ARjPXgII(TT0f;BnuQ$Y82qDTX_;Qt>WD)b8&d}^k~5dp4%kTiX^>Oe zD!g_@H-8aK$w2PRWX(7DDMygf{#SkxyX#?U-d@g0( zr;9jF0XU3gWGF;K`tydH6dDZ~A2jZJwcr-A+WLh!rZtu*4*3H; zMVV9NC1{sxTQ4Y;hK0ooj!5W#?qm-C_*V<7*0XARcPO$k&FC~Lb#K$}V9520(MUPZ zi~z2Osv23SP#@T7usj@yM?YX%v82|}6!9sxLT3_I%}}w@LSoD^b}e1HCj^QAL=ZSq z``o+7xv>=!ysG{i$PR&mGXI?VRfBpf$``S5{mS;D`-?fe8UYPhoEBn`ghNdv-+ATQ zq}TirKl)?-kLk_Zl^tQ+PkvRpn=DmMg0+6bsZ);#NG`4UG3UYUXYrJH2n0)$IS;0# zTJ8QEkGE?Yvz8gVE~Tp!@~+KYu|=F|HWCOr{Ez|>91S1)u`thy1<-xdcg$X7m2H*Q zcumIbeI9SHf9ihu@>j9X{Q9Dy*dH!dxma?ucq*bbl&`;0-|hj2p6WWA-G#F7$6PH) z+}|W1Xv=K9d-V#!@Q^B#01!=|>(CzEFKk{46iSv2o?jk*?OtVZKlC!?IWr3y28JR~ zf}lVy;^*0%8#pjY-pF}sVrH#BQA7rr_psAzQcCsKMNbe9jx}4*(uKXxh~aXSdqXEs zs%-=_-3x+E-$pm#ySY`tUsFqVRMZcC+6^;Zj!c7uqFe>VVoh*Jr+gHpO>3aXey@eT zS;%XXqS)UZ`sJjQrSD&E%bm}Y*FOdcUTWz#`A5dV^?}ZoAg#(Z*RG_~Y32f&4B|Wv zirjPLRoTzwQ%t{}RXPyg7=#7-snN1pmc|p|Asr=4`*PQ~<8w7(1Wi&-TkEU52VYZ4 zrY^WwU)R{aa7epA_DoELyBTT$)mBvn(m zu4Tv{C4u)Fw*)FS#R8a?)gDHmnWK5n2&zP%UobjJ)7~0wSNjzFyz1W0soraoimwac zGo-IMZ-NIU0-EHC{MYsl%!@ON7i37l4OIjMiYAZ)yff?5rie5FLOH!8L|sqg_i9k7 zmBZfMynRoj0FmcL0mlr^c0K9;Ab=@~Q?8Kvta>29S2{Uevig2GB=PHNi!taMEqT{U zs`5b5x#v zuzxeBfri2ZVj?$AHQy*z0ir0Z3p=NUs#+eZ@b|0U~XRUIWzZujmnas#j#o$5< z6$a;NsG;mNuegyl(|hzsex)u09mmne4s-8{{Z}h&5(6seudH_roJS$#=3|^)@ll!s z`T4bN;82~LVD`8B2j@>1&ivvFntgXaxB(Rv`p&D*yu*J4Zu$PefJ&w+44#C>s2|>a zxL(;;c~TjC3i-m~%3E-bwIS`yeRzU^{pDBi4nT%^S|Q4kTVMK1p9fFgvEI8 zgP%J_Dl=Eq{@r2shT^nL3=}v143yqmxITU!xVdA}Z@Ych?wAeDi*y_hVY~TBVar-Q z=WJ)chSIx^Y}_Jx4P& z>RBFK{rGnBjkjTnb?xfITK1Q6=gg6zk9rS+Ud z0VDNg6Uh`w*TGNgO)`$I7hPP7aULB7p&jK~h#=9z6iFl11vC0Li;_k-8YATRhyLEb z!{snh7Wjavm~1b%H)j%P@+5d2{3{@Lwy}u%?)Q|-d&fTW0Nw`FtxRr9&qiGZ0Y8o$ zeH4XT!DIR-BL49QP>C-ADE`AiC`&&a4Mvvu#&uhcf691bc&LWWe{{ zFLCbAVX83@Yk#F3Y`1w$eGoT%Ah1-kuYnOB4MVV*9;d&RpPI|wJ6+3jfn!dr)pYtg zyoa*_uy}w(ZLSOd?70*^nYFDd*(b8g(%=QbT~VUwmUg}3?i7WzxKEWgM)U!WwuELT zeQKE!nSO8pedOP`Pd66CIIl;|Y<#WO=#b!q>t-^~r)fqjf9kN{aTEf6aEt1!ycykG z__a1!B6t3L1fUIN%k)1xRJZQ53E7+QbiUmDD06JrL5KFeW$=*lB#8Phc<8#A0dK=> z1I!(>KiSD`;jkFlOQl7fP&$rb>6YZgid?Khj*+Kma&|;T=Y@1aW-Z~lAWb`!E=6d! zEpQQ%Yn0R0f?j#nf=g_e0?voWOH1Ht(RT*2>lw6_0^_XmPY|48SVNGRa$6U`-Sh$A z94mJX4`My1o=wi$vw1V^Ebta7$l*UH15mTV)Aw#%o26gUf`K_E=5TDf2i$PkZN&Sb zR`%PSJ0mRNfq9SPE(Lu~^(a}b1$1tMTG(wH8DQg$O-=gV@~)9F|6TQG8yYoF>>E2e z2_0bgY~M4$V&(n4oHl11!zebm1y5WnCf)rVfO{7tAw_?!d*d{(v09NDo1LqTdLft43mG*cSQ zsDuf9@@+Or0#|(m^)E?{EEO=}zUgVJ-QbjrZomjw>B63}$stS~iF?`E5bVuDSWIGG zoWoxS4sq^Uohc7OlJI`wW!K|=P~~IiBhe}k)!RaZ2trpR$PRxma$vcU+x>Bh?t2pc zCrPe+=OYuB>HA_3MrpT$H>^honWhqh2o-_^BAzWTLOl7P&FVny?wJuQp zNCzW$ajym@@}oK*kXV0RB?Bg z^Ez;wgJg(_bl@OdnuirvEw~B9GnLU?vR-_%oGzZ=bWL1k% z0`gx{yHwH;HkH5I;f+pJ z5wFcE$6&dPd5$M3RKXuUwgTG0ziJFeRmHE0EIDZMvIW1{Vq_F4SV(H|;pFzR*-$1s zb&*M&_sC{ckMEr_P+nVL4$l8GE%}Y3`J2&|R+7)k)+d*Xk5wq*5Sy~4jr2YsTX;2( z8=+5CZ(+n|IL04JX6(L#y)Q8lwaAKJPR1<=1!)*SqPQhl6kjVwb$!lP^C6Gig$}L-of{b)%oTEK$i$N%& z1PnEwgmY>aY$3pVC$>n-8+h;YZQ2E;epZw(bP((5V7efz4?0AV# z<+F{Y5U7lh%#Th(tSlp4IMm|^*D*);nc`k|r+vRqFOVs&P#BRQFRjHxX$m-%^Vhn6 z)C)WX`;N;Q8B1pa)H_e02|^`o$y%cOrfPNBHG!DDS3cu9STSZn7NJ}OeNdX_3?E^N zM`>|&bvf&h*nZ}#*}+K+>S|rmXTuqK$Y^GW8VD4djF-s{A5`VAY$IKHeMqnJA^bX^ zO$IV1st-Ja33c%4WI0D1tC#8+4LZNA=@G^dXNa@F55hGRrz^vXEt_IBe%Gd7Sz8qW$OJ4HmU4KObxM{`{&VucNu)@z7F-Ca1^NU=DXC5{UIk z3f3WI%q{z{Nl()vv>0e6|0gz4zdo^woWnff%77=FmFltf_IF!XQfdq!KU@BzO4d+~ z=*JY?&Q=0{S4*4K23xbE-NG*k%&WQY{4r8LSQ^#X!F63e&DcfzCj9crY5CvmiOJq4 zc*BHVhXy=Sd_-NDHags%T;2&=7aE7UV9_X8X2t~vggeU<)so7h?(iYDL9*d+e zUsbNhdn(@1uD{T5JS-Mby`()_doVblDy;~X>i{nwS{+dg341WV`_kW-g{6MLZtLwB z%o2=&h`zl8Ykujs0N9x1aOAXR*jHLlmPiX|Mt%)&@ddIg4P0YaM?Xrzokq*KD4oAd z^AOR;O013D%IDQa0?%DB*m_hlaC8X_nm1UuHR%$&^`P_d=>CRL(312_4Uhghg;QkM zhTjJh>8W@jujQg9hMC#r8&k3Z+&HMi$j=K*sxZ!H#WZ8^OqU_tFTVc~J9D(Q#oVNs zkY3h6F;5Og*~OVMXrcY!jf`-gkhmeC$DypB+=f3wc>52}b;Tbz0FcRlABW|9JYfNJ5#)=j3}N zOdo#ULSD4)n@_NGHUnDGsKhzC-0ZkAx$RFC_+jjq&5e6XfLi(1*NotJ)!xUu6+mR6 zkQX@#&IkP(NB><6JIAJd7HuyzkWTKI{{5>m(1iorzx3&?@GPS5UUaF0zRaJ?ga-UB zorq1Jl;0Lp$W#QrD}{#ghW4biKtgs~;Ac>GAbM??BPOoG5fiBdB!)W&Rr&5XE*wg_NrE$XO2`5|k~GstGhp@9s>E+v z>oU{I%UebK0RLjKfw8dG2jYLypkTM1Ad}g*Tl6t~?^AlO)bZ&w)`aca&1`vwZeYj* zUqD@+bTLu>aIJ&za=-Q0LDr_B*vQAd3zO{xd6bvW|t25b6}UT&7^I=KcFZG?#nD#^#K*dZm7{ciT$6 z?a%*25Ba0A&L?9ItTG~fD4TE8&SxN-gn9bErxCI^BxjKii?tt#_)vXrPSuS~Dc@|~ zgq%@lKpUwUz?HIt(-#5zD(-EpZU+V;q+irCgI?rVDPd{ zr#R1aSm(jZi`PqQfGj?N3m>-sQ)87XYnSxA4<3<@Wy5M1(4M_T+N+4eZBgp9XXmDDgNn*3g%$6XsPs#|K*r2u%NYebrmSqvv?Uv(=>S(|-vR#v{BO5&EzObbt@x=~k*n}LBG>7iJpLOoc|470} zXcrz*N z+gHhuqC8qLx+lRD)W|CaE`L)2#ITN&4{rlLYJ6|77@0Dme_l{;LQCChs;`8)?P(E|^)&Tr$WpdEi*5x+a!gIzEwpA?>!i*$fVMw`qReE)wRy`r& zxRuttz&V}h6Rby+Y(B;6^>$4hod9QpYuWte3}`&Avz#T+{~Yy|9I` z;+#jX8gWIYWy;@&*)u0Xyx%Md6|{*P{?nHnxHR-N(zggqXzw_UCJe^Y3IuWux|n>9 zy>gCZ0m$%~F9R*7)2r80gFF}Hss%VFl2w+1)AITSH1m_Dp0=CbibB*xIivx9u3^9~ zl#mV5YOm-pFFSaqX*ZXG6wSperF$(1)=hktzJq>&X7mO;GIgwnB?Jp}JzppA;oMej zfEV2ATkkd79xpN}h71vh)M88-K-~ludD0@9+HKUxcPU17&hiJ`nHdPRu z@kk92sm4b@*yc)b0+%6^%k-Bvd$j`#22xK;zZPM0e{Ip6eq2*@80uC$tvH~%7M-9+ z0<+YfeKQIlWq&;lV^o*_&$oCsykk_A6`;*Jr73j`4WD^K)<8a<6>y;f{Hk=dh$?)boes z-ydti(uLswl?WDytyVRLiCyW}u!D28h&W*k3EHmND&%&rqbAoa5~LhrvNIyPJ=ak6 znci3T&DtWSP0o-PSglvvQm-6E|Cyf6GcVorl=7HBbvwpSbEo(I8m*Y_ICCpV@cH41 zX~1d*LdBtOLw-=i2%<~$lYX`Pc{ZDs>;C_)o=}wXQALSl{{3}-FYK59R)c_lBcnBp zx#{z-N2(W~^-^gyRV@1UdNN_s`P3x{|0w`&kEXep_;LLBUOq7|u||=d-RKM|`?W@Y zZ6RA2(Ho|Tx*GJ|`%qTcjrbu6udG~Omfyg}ZhqYAtbURho2k^g-3A|bNa(3({Z{CM z6*!Krs=|)QDQwL(WzshLntRcbUo7V)AK4b^^hGR>fJESVxArCEsR#RY>x=ID?+)HG z*1oLu?e7^%_?)l;Z2FUk*Fqx=+Iympg@0+mGA=2KCkd$TEhi~5>E|Sgr$n1v`8lff z!Ait)jEII;{F*`)+(@9tC|jCr6WymD@M#PbY6p($0@Wr8F<3~fg3TiZ zJ1MZs1WDkbr0Kci*$a2RYhQ+5qurQ4emKqf^S#DB$ng5WR4Qieph z3iSNo&i%@c(g@29f4;`T*oBhitk{aaFd4_o5SpD{$7gCx0+J$UIY=^)9BGx1#+w3U zK(e%%QfRaQL!sw4lA9Twy2ky_9bBm@YU;U#{{P#&)(E-eK*7!GKqhYB$P@};@zmT zuvcMNv*)5FGWlGkwJ04m?LvZlCXT{Nidgn7SzKAn zL1Z-HZ_iE&n1o7sr4adi8Ab}88kkn7mFZ?O2AK(w=dWC~tcH;CLN1|=V;xZt9-fGm z-~)%1?VwJp@LH4d;v!9W3r1J1Eto^Tq@h6%rRvW|iOC5kxu zWN5Q^CQ!~7`eueB@#DK)!5F$uQs@npI`YLcUb#uU+hVN$LP)M`s>a_wlZR=wSmcLUNS9q21XKD9O^^>f zeu^UI?3)fmhGNA;U=7%Vp(q(L3(1{oKvJ%Sf4>~YSp;Bq^zy2(0HBVjCpqtxh2z=S z<%TLS+%*e83_UBdV1lSgl6>!d)e*z|jF*Dy6}kO>2Dra*nS(~<0CKWCVZDSN$Cg|N z*UgxAaagHsff?|^DJG4Ty2m?s*Q%_}TYE^1$*FN*Vs^9&Lc(>Oz3e*V^c8j8yv)Xyx0k;Z>A=v)|DWSf_}IuNW)~BW SS;n6}00SLEVzCw}^#1@rCzQzm literal 0 HcmV?d00001 From a75071d025ff61125759792d3d36e94dfd480547 Mon Sep 17 00:00:00 2001 From: Aiden Sorabji Date: Tue, 4 Jun 2024 12:18:21 -0600 Subject: [PATCH 2/3] Rename Sorabji - Word (Python).py to Archive/Sorabji - Word (Python).py --- Sorabji - Word (Python).py => Archive/Sorabji - Word (Python).py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Sorabji - Word (Python).py => Archive/Sorabji - Word (Python).py (100%) diff --git a/Sorabji - Word (Python).py b/Archive/Sorabji - Word (Python).py similarity index 100% rename from Sorabji - Word (Python).py rename to Archive/Sorabji - Word (Python).py From 72ddd73b2b0f81b10b3ecf85c65c1aaaadd37570 Mon Sep 17 00:00:00 2001 From: Aiden Sorabji Date: Tue, 4 Jun 2024 12:18:46 -0600 Subject: [PATCH 3/3] Update and rename Word.py to main.py --- Word.py => main.py | 4 ---- 1 file changed, 4 deletions(-) rename Word.py => main.py (99%) diff --git a/Word.py b/main.py similarity index 99% rename from Word.py rename to main.py index 16d91e5..3d30631 100644 --- a/Word.py +++ b/main.py @@ -1,7 +1,3 @@ -# WHAT TO ADD NEXT -# -# - Intro Screen (New File, Load File, Keep the other buttons) Then turn in to actual editor - # Modules import customtkinter import os