diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..073e637 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "todo-tree.tree.showBadges": true, + "todo-tree.tree.showCountsInTree": true +} \ No newline at end of file diff --git a/Tkinter-grid-Sticky-Options.png b/Tkinter-grid-Sticky-Options.png new file mode 100644 index 0000000..6729df8 Binary files /dev/null and b/Tkinter-grid-Sticky-Options.png differ diff --git a/controller/Frames.py b/controller/Frames.py index 9ef9766..96a6856 100644 --- a/controller/Frames.py +++ b/controller/Frames.py @@ -15,4 +15,4 @@ class Frames(Enum): @since 2022-08-30 """ Home = 1 # Home view - Info = 2 # Info & copyright view \ No newline at end of file + Info = 2 # Info & copyright view diff --git a/controller/HomeController.py b/controller/HomeController.py index 9d046a1..d3e21a1 100644 --- a/controller/HomeController.py +++ b/controller/HomeController.py @@ -37,7 +37,15 @@ class HomeController: :frame: -> The frame we want to launch. """ - self.__main_controller.change_frame(frame) + #self.__main_controller.change_frame(frame) + self.__view.add_log("Salut comment vas tu ? 1") + self.__view.add_log("Salut comment vas tu ? 2") + self.__view.add_log("Salut comment vas tu ? 3") + self.__view.add_log("Salut comment vas tu ? 4") + self.__view.add_log("Salut comment vas tu ? 5") + self.__view.add_log("Salut comment vas tu ? 6") + self.__view.add_log("Salut comment vas tu ? 7") + self.__view.add_log("Salut comment vas tu ? 8") def on_download_started(self, url: str, name: str) -> None: """ @@ -47,4 +55,4 @@ class HomeController: :name: -> The name of the folder in which put pictures. """ pass - # END View events \ No newline at end of file + # END View events diff --git a/controller/InfoController.py b/controller/InfoController.py index 49a7c4b..e29b50c 100644 --- a/controller/InfoController.py +++ b/controller/InfoController.py @@ -38,4 +38,4 @@ class InfoController: :frame: -> The frame we want to launch. """ self.__main_controller.change_frame(frame) - # END View events \ No newline at end of file + # END View events diff --git a/controller/MainController.py b/controller/MainController.py index ed92b8a..b563274 100644 --- a/controller/MainController.py +++ b/controller/MainController.py @@ -20,18 +20,29 @@ class MainController: def set_view(self, view) -> None: """ [function for view] + => Allow to define the controller view. :view: -> The view that this controller manage. """ self.__view = view - # END view methods + + def on_check_for_update(self) -> None: + """ + [event function for view] + => Event launched when a check for available updates is requested. + """ + # TODO write the function + print("on_check_for_update") + pass + # END View methods # START Controller methods def change_frame(self, frame) -> None: """ [function for controller] + => Allows you to request a frame change in the main window. :frame: -> The frame we want to display on the window instead of the current frame. """ self.__view.show_frame(frame) - # END Controller methods \ No newline at end of file + # END Controller methods diff --git a/main.py b/main.py index 1eb631e..1ad10bb 100644 --- a/main.py +++ b/main.py @@ -35,4 +35,4 @@ if __name__ == '__main__': main_window.show_frame(Frames.Home) # Start main windows looping (launch program) - main_window.mainloop() \ No newline at end of file + main_window.mainloop() diff --git a/view/HomeView.py b/view/HomeView.py index 9a653b5..ef73941 100644 --- a/view/HomeView.py +++ b/view/HomeView.py @@ -1,5 +1,6 @@ import tkinter as tk from tkinter import ttk +from tkinter import scrolledtext as st from controller.Frames import Frames from controller.HomeController import HomeController @@ -21,23 +22,26 @@ class HomeView(ttk.Frame): def __init__(self, parent, controller: HomeController): super().__init__(parent) + # Init view + self.__init_content() + # create widgets # label - self.label = ttk.Label(self, text='Email:') - self.label.grid(row=1, column=0) + # self.label = ttk.Label(self, text='Email:') + # self.label.grid(row=1, column=0) # email entry - self.email_var = tk.StringVar() - self.email_entry = ttk.Entry(self, textvariable=self.email_var, width=30) - self.email_entry.grid(row=1, column=1, sticky=tk.NSEW) + # self.email_var = tk.StringVar() + # self.email_entry = ttk.Entry(self, textvariable=self.email_var, width=30) + # self.email_entry.grid(row=1, column=1, sticky=tk.NSEW) # save button - self.save_button = ttk.Button(self, text='Save', command=self.event_btn) - self.save_button.grid(row=1, column=3, padx=10) + # self.save_button = ttk.Button(self, text='Save', command=self.event_btn) + # self.save_button.grid(row=1, column=3, padx=10) # message - self.message_label = ttk.Label(self, text='coucou toi :D JE SUIS SUPER MAN héhéh', foreground='red') - self.message_label.grid(row=2, column=1, sticky=tk.W) + # self.message_label = ttk.Label(self, text='coucou toi :D JE SUIS SUPER MAN héhéh', foreground='red') + # self.message_label.grid(row=2, column=1, sticky=tk.W) # place this frame # self.grid(row=0, column=0, padx=5, pady=5) @@ -46,7 +50,57 @@ class HomeView(ttk.Frame): # Save and setup main controller self.__controller = controller controller.set_view(self) + + # START Internal function + def __init_content(self) -> None: + """ + [internal function] + => Initialize the view content. + """ + self.columnconfigure(0, weight=1) + self.columnconfigure(1, weight=3) - def event_btn(self) -> None: + # Website link + self.web_label = ttk.Label(self, text="Website URL:") + self.web_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5) + self.web_entry = ttk.Entry(self, width=50) # show="-" + self.web_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) + + # Download name + self.name_label = ttk.Label(self, text="Download Name:") + self.name_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5) + self.name_entry = ttk.Entry(self, width=50) + self.name_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) + + # Logs area + self.log_area = st.ScrolledText(self, wrap=tk.WORD, state = tk.DISABLED, width=40, height=8)#, font=("Times New Roman", 15)) + self.log_area.grid(column=0, row=3, sticky=tk.EW, columnspan=2, pady=10, padx=10) + + # Download button + self.download_button = ttk.Button(self, text="Start downloading", command=self.event_btn) + self.download_button.grid(column=1, row=4, sticky=tk.E, padx=5, pady=5, ipadx=5, ipady=2) + # END Internal function + + # START Controller methods + def add_log(self, line: str) -> None: + """ + [function for controller] + TODO desc + """ + print("ADD: ", line) + self.log_area.configure(state=tk.NORMAL) + self.log_area.insert(tk.END, f"{line}\n") + self.log_area.configure(state=tk.DISABLED) + + def clear_log(self) -> None: + """ + [function for controller] + TODO desc + """ + self.log_area.delete(0, tk.END) + + # END Controller methods + + def event_btn(self) -> None:# TODO remove print("you clicked ! And now you are on info page ... :D") - self.__controller.on_change_view(Frames.Info) \ No newline at end of file + self.__controller.on_change_view(Frames.Info) diff --git a/view/InfoView.py b/view/InfoView.py index 1d38a24..f497a44 100644 --- a/view/InfoView.py +++ b/view/InfoView.py @@ -50,4 +50,4 @@ class InfoView(ttk.Frame): def event_btn(self) -> None: print("you clicked on the button that is on the info view!") print("got redirected to the home view :D") - self.__controller.on_change_view(Frames.Home) \ No newline at end of file + self.__controller.on_change_view(Frames.Home) diff --git a/view/MainWindow.py b/view/MainWindow.py index d5e182c..0f54670 100644 --- a/view/MainWindow.py +++ b/view/MainWindow.py @@ -1,7 +1,5 @@ import tkinter as tk -from tracemalloc import Frame from controller.MainController import MainController -from controller.Frames import Frames class MainWindow(tk.Tk): @@ -18,7 +16,7 @@ class MainWindow(tk.Tk): # Variables __controller: MainController = None __views: dict = None - __current_view = None + __frame_id: int = None # Constructor def __init__(self, controller: MainController): @@ -27,19 +25,50 @@ class MainWindow(tk.Tk): # Init view repository self.__views = {} - # Init main window - self.title('Tkinter app') - self.geometry('450x250') - self.resizable(False, False) - self.config(bg='#f7ef38') - - self.rowconfigure(0, weight=1) - self.columnconfigure(0, weight=1) - # Save and setup main controller self.__controller = controller controller.set_view(self) + # Init view components + self.__init_window() + self.__init_top_menu() + + # START Internal methods + def __init_window(self): + """ + [internal function] + => Initialize window parameters + """ + self.title('Tkinter app') + # self.geometry('450x250') + self.resizable(False, False) + self.config(bg='#f7ef38') + + def __init_top_menu(self): + """ + [internal function] + => Initialize top menu of the window. + """ + main_menu = tk.Menu(self) + + col1_menu = tk.Menu(main_menu, tearoff=0) + col1_menu.add_command(label="Open folder", command=self.alert) + col1_menu.add_separator() + col1_menu.add_command(label="Quit", command=self.alert) + main_menu.add_cascade(label="File", menu=col1_menu) + + col2_menu = tk.Menu(main_menu, tearoff=0) + col2_menu.add_command(label="Check for update", command=self.__controller.on_check_for_update) + col2_menu.add_command(label="About", command=self.alert) + main_menu.add_cascade(label="Help", menu=col2_menu) + + self.config(menu=main_menu) + + def alert(self): + # TODO remove + print("You clicked") + # END Internal methods + # START App methods def add_view(self, frame, view): """ @@ -54,15 +83,16 @@ class MainWindow(tk.Tk): def show_frame(self, frame): """ [function for app & controller] + => Allows to display the selected frame provided that it + has been previously added to the frame dictionary. :frame: -> the frame if of the view to display. """ - new_view = self.__views.get(frame) - if new_view: - if self.__current_view: - self.__current_view.pack_forget() - new_view.pack(fill=tk.BOTH, expand=False) - self.__current_view = new_view + if self.__views.get(frame): + if self.__frame_id: + self.__views.get(self.__frame_id).pack_forget() + self.__views.get(frame).pack(fill=tk.BOTH, expand=False) + self.__frame_id = frame else: raise ValueError("Unable to find the requested Frame") - # END Controller methods \ No newline at end of file + # END Controller methods