This app is made to take notes of what you want to build. It is a wip, so there are many bugs, the code is on github (click on the left).
Teh result can be seen here:
I will post the code also here
# tkinter advanced: pybookgen ''' Started: 03.12.2020 - v. 0.1 - chapter - chapter1.txt - chapter1img1.png GUI --------------------------------- PyEbookGen --------------------------------- chapter1 | text | ''' # module for the gui import tkinter as tk # module to check files import os from tkinter import simpledialog from tkinter import messagebox import time class Win: def __init__(self, title, version, folder, extension): self.extension = extension self.letter_size = 16 self.root = tk.Tk() self.filename= "" self.folder = folder self.root.title(f"{title}.{version}") self.window() self.binding() self.expand_widgets() def expand_widgets(self): # tk.Grid.rowconfigure(self.root, 0, weight=1) tk.Grid.rowconfigure(self.root, 1, weight=1) tk.Grid.columnconfigure(self.root, 0, weight=1, minsize=100) # ==== This are for adjusting characters inside _text def big_letters(self): if self.letter_size < 72: self.letter_size += 2 self._text['font'] = "Arial " + str(self.letter_size) def small_letters(self): if self.letter_size > 8: self.letter_size -= 2 self._text['font'] = "Arial " + str(self.letter_size) def wheel(self, event): if event.delta == 120: self.big_letters() else: self.small_letters() def popup(self, title="", sentence=""): "Simple wrapper function for messagebox.showinfo" tk.Tk().withdraw() name = messagebox.showinfo( title=title, message=sentence) def save(self): "Saves the file selected in the listbox" if self.filename != "": try: with open(f"{self.folder}/{self.filename}", "w") as file: file.write(self._text.get("0.0", tk.END)) except: self.popup("Message", "Nothing selected") def delete(self): try: cur = self._lbx.curselection() for i in cur: self.filename = self._lbx.get(i) os.remove(f"{self.folder}/{self.filename}") print(f"Deleted {self.folder}/{self.filename}") self.showlistitems() except OSError as e: print("Failed with:" , e.sterror) print("Error code:" , e.code) def input_filename(self, title="Enter a new name", sentence="Do not put the extension"): #tk.Tk().withdraw() name = simpledialog.askstring(title, sentence) try: if name != "": return name + self.extension except TypeError: return "" def run(self, evt): print("ok") print("Running: " + self.folder + "\\" + self.filename) os.startfile(f"{self.folder}\\{self.filename}") def binding(self): self.root.protocol("WM_DELETE_WINDOW", self.quit) self.root.bind("<Control-n>", self.newfile) self.root.bind("<Escape>", self.quit) self._lbx.bind("<<ListboxSelect>>", self.showcontent) self._lbx.bind("<Double-Button-1>", self.run) self._lbx.bind("<B1-Motion>", self.multiple_select) self._text.bind("<Control-s>", lambda x: self.save()) self._text.bind("<Control-MouseWheel>", self.wheel) def multiple_select(self, evt): print("Hello") def open_folder(self): # print(self.filename) os.startfile(self.folder) def quit(self, evt=""): #self.save() self.root.destroy() def newfile(self, evt): "Create a new file" self.save() self.newfilename = self.input_filename() if newfilename != "": with open(f"snippets/{self.newfilename}", "w") as file: pass self._lbx.insert(0, self.newfilename) def newfile2(self): "Create a new file" self.save() newfilename = self.input_filename() if newfilename != "": with open(f"{self.folder}/{newfilename}", "w") as file: pass self._lbx.insert(0, newfilename) return newfilename def showlistitems(self): self._lbx.delete(0, tk.END) list_of_items = os.listdir(f"{self.folder}") list_of_items.sort() for file in list_of_items: if file.endswith(self.extension): self._lbx.insert(0, file) self._lbx.focus() def window(self): "Contains all the widgets" def frame0(): "Contains the text" self._frame0 = tk.Frame(self.root, bg="gold") self._frame0.grid( column=0, row=0, columnspan=2, sticky="nswe" ) self._frame0.grid_rowconfigure(0, weight=0) self._frame0.grid_columnconfigure(0, weight=0) self._frame0.grid_columnconfigure(1, weight=0) def label_banner(): "This is at 0,0 and occupies 2 column" img = tk.PhotoImage(file=f"{self.folder}/banner.png") self.lb_banner = tk.Label(self._frame0, image=img, bg="yellow") self.lb_banner.image = img self.lb_banner.grid( column=0, row=0, columnspan=2, sticky="nswe" ) def frame(): "Contains the list of chapter names in listbox" self._frame = tk.Frame(self.root, bg="gray") self._frame.grid(column=0, row=1, sticky="nswe") for n in range(9): self._frame.grid_rowconfigure(n, weight=1) self._frame.grid_columnconfigure(0, weight=1) # self._frame.grid_columnconfigure(1, weight=1) def frame2(): "Contains the text" self._frame2 = tk.Frame(self.root, bg="gold") self._frame2.grid(column=1, row=1, sticky="nswe" ) self._frame2.grid_rowconfigure(0, weight=1) # self._frame2.grid_rowconfigure(1, weight=1) self._frame2.grid_columnconfigure(0, weight=1, minsize=1) def listbox(): "The book chapter name list goes here" self._lbx = tk.Listbox( self._frame, bg="yellow", # selectmode=tk.MULTIPLE ) self._lbx.grid( column=0, row=0, sticky="nswe" ) # adapt the listbox to the frame # self._lbx.configure(selectmode="") self.showlistitems() def button(text, column, row, command): "The book chapter name list goes here" but1 = tk.Button(self._frame, text=text, bg="yellow", command=command) but1.grid( column=column, row=row, sticky="nswe" ) # adapt the listbox to the frame def scrollbars(): self.scrollbar = tk.Scrollbar(self._frame2) self.scrollbar.grid(column=2, row=0, sticky="nswe") def text(): "Contains the text of selected chapter in listbox" self._text = tk.Text(self._frame2, wrap=tk.WORD) self._text.grid(column=0, row=0, sticky="nswe") self._text.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self._text.yview) def widgets_order(): "The widgets on the screen" frame0() frame() frame2() label_banner() listbox() button("save", 0, 1, self.save) button("new", 0, 2, self.newfile2) button("delete", 0, 3, self.delete) button("open fld", 0, 4, self.open_folder) button("Files .py", 0, 5, lambda: self.new_file_extension(".py")) button("Files .txt", 0, 6, lambda: self.new_file_extension(".txt")) button("Join", 0, 7, self.join) button("CLEAR", 0, 8, self.clear) scrollbars() text() widgets_order() def write_in_text(self, text): self._text.delete("0.0", tk.END) self._text.insert(tk.END, text) # self._lbx.config(state="normal") def join(self): print("Joining all files") text = "" # self._lbx.config(state=tk.DISABLED) list_files = [f for f in os.listdir("snippets/") if f.endswith(self.extension)] print(list_files) list_files.sort() for file in list_files: with open(f"snippets/{file}") as file_to_add: text += file.split(".")[0] + "\n=========\n" text += file_to_add.read() text += "\n\n\n\n\n" self.write_in_text(text) # self.nf = self.newfile2() # self.save() def new_file_extension(self, ext): self.extension = ext self.showlistitems() def showcontent(self, evt): self._lbx.focus_set() #self.save() try: filenum = self._lbx.curselection() self.filename = self._lbx.get(filenum) with open(f"{self.folder}/{self.filename}") as file: content = file.read() self._text.delete("0.0", tk.END) self._text.insert(tk.END, content) except: self.save() def clear(self): self._text.delete("0.0", tk.END) self.save() def create_chapters_folder(folder): "Create the folder for the snippets if not exists" if folder not in os.listdir(): os.mkdir(folder) print("Created a folder named chatpters") def console_intro(): print(""" Save your chapters in chapters folder """) # ================ main ============ if __name__ == "__main__": console_intro() ########################################################### # CHOOSE TYPE OF FILE AND THE FOLDER WHERE YOU STORE THEM # # # In case you want to store txt files change to .txt the # FILE_EXTENSION costant. # If you need to change the name of the folder where to # search or save the files change the FOLDER_FOR_FILES # value to the name of the folder you want # # https://pythonprogramming.altervista.org #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° FOLDER_FOR_FILES = "snippets" FILE_EXTENSION = ".txt" #°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° create_chapters_folder(FOLDER_FOR_FILES) ver = "0.1" win = Win(__file__, "1.1", folder=FOLDER_FOR_FILES, extension=FILE_EXTENSION) win.root.mainloop()
Subscribe to the newsletter for updates
Tkinter templates
My youtube channel
Twitter: @pythonprogrammi - python_pygame