From 5297286b7ad06cc842dbc02c96547952b59436f4 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Thu, 19 Sep 2019 16:24:21 -0700 Subject: [PATCH 1/4] working on menubar --- coretk/coretk/app.py | 583 +++++++++++++++++++++++++++++++++++- coretk/coretk/menuaction.py | 334 +++++++++++++++++++++ 2 files changed, 911 insertions(+), 6 deletions(-) create mode 100644 coretk/coretk/menuaction.py diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index 163c8a17..8e023cac 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -1,6 +1,7 @@ import logging import tkinter as tk +import coretk.menuaction as action from coretk.graph import CanvasGraph from coretk.images import Images @@ -25,16 +26,586 @@ class Application(tk.Frame): self.master.tk.call("wm", "iconphoto", self.master._w, image) self.pack(fill=tk.BOTH, expand=True) + def create_file_menu(self): + """ + Create file menu + + :return: nothing + """ + file_menu = tk.Menu(self.master) + file_menu.add_command( + label="New", command=action.file_new, accelerator="Ctrl+N" + ) + file_menu.add_command( + label="Open...", command=action.file_open, accelerator="Ctrl+O" + ) + file_menu.add_command(label="Reload", command=action.file_reload) + file_menu.add_command( + label="Save", command=action.file_save, accelerator="Ctrl+S" + ) + file_menu.add_command(label="Save As XML...", command=action.file_save_as_xml) + file_menu.add_command(label="Save As imn...", command=action.file_save_as_imn) + + file_menu.add_separator() + + file_menu.add_command( + label="Export Python script...", command=action.file_export_python_script + ) + file_menu.add_command( + label="Execute XML or Python script...", + command=action.file_execute_xml_or_python_script, + ) + file_menu.add_command( + label="Execute Python script with options...", + command=action.file_execute_python_script_with_options, + ) + + file_menu.add_separator() + + file_menu.add_command( + label="Open current file in editor...", + command=action.file_open_current_file_in_editor, + ) + file_menu.add_command(label="Print...", command=action.file_print) + file_menu.add_command( + label="Save screenshot...", command=action.file_save_screenshot + ) + + file_menu.add_separator() + + file_menu.add_command( + label="/home/ncs/.core/configs/sample1.imn", + command=action.file_example_link, + ) + + file_menu.add_separator() + + file_menu.add_command(label="Quit", command=self.master.quit) + self.menubar.add_cascade(label="File", menu=file_menu) + + def create_edit_menu(self): + """ + Create edit menu + + :return: nothing + """ + edit_menu = tk.Menu(self.master) + edit_menu.add_command( + label="Undo", command=action.edit_undo, accelerator="Ctrl+Z" + ) + edit_menu.add_command( + label="Redo", command=action.edit_redo, accelerator="Ctrl+Y" + ) + + edit_menu.add_separator() + + edit_menu.add_command( + label="Cut", command=action.edit_cut, accelerator="Ctrl+X" + ) + edit_menu.add_command( + label="Copy", command=action.edit_copy, accelerator="Ctrl+C" + ) + edit_menu.add_command( + label="Paste", command=action.edit_paste, accelerator="Ctrl+V" + ) + + edit_menu.add_separator() + + edit_menu.add_command( + label="Select all", command=action.edit_select_all, accelerator="Ctrl+A" + ) + edit_menu.add_command( + label="Select Adjacent", + command=action.edit_select_adjacent, + accelerator="Ctrl+J", + ) + + edit_menu.add_separator() + + edit_menu.add_command( + label="Find...", command=action.edit_find, accelerator="Ctrl+F" + ) + edit_menu.add_command(label="Clear marker", command=action.edit_clear_marker) + edit_menu.add_command(label="Preferences...", command=action.edit_preferences) + + self.menubar.add_cascade(label="Edit", menu=edit_menu) + + def create_canvas_menu(self): + """ + Create canvas menu + + :return: nothing + """ + canvas_menu = tk.Menu(self.master) + canvas_menu.add_command(label="New", command=action.canvas_new) + canvas_menu.add_command(label="Manage...", command=action.canvas_manage) + canvas_menu.add_command(label="Delete", command=action.canvas_delete) + + canvas_menu.add_separator() + + canvas_menu.add_command(label="Size/scale...", command=action.canvas_size_scale) + canvas_menu.add_command(label="Wallpaper...", command=action.canvas_wallpaper) + + canvas_menu.add_separator() + + canvas_menu.add_command( + label="Previous", command=action.canvas_previous, accelerator="PgUp" + ) + canvas_menu.add_command( + label="Next", command=action.canvas_next, accelerator="PgDown" + ) + canvas_menu.add_command( + label="First", command=action.canvas_first, accelerator="Home" + ) + canvas_menu.add_command( + label="Last", command=action.canvas_last, accelerator="End" + ) + + self.menubar.add_cascade(label="Canvas", menu=canvas_menu) + + def create_show_menu(self, view_menu): + """ + Create the menu items in View/Show + + :param tkinter.Menu view_menu: the view menu + :return: nothing + """ + show_menu = tk.Menu(self.master) + show_menu.add_command(label="All") + show_menu.add_command(label="None") + show_menu.add_separator() + show_menu.add_command(label="Interface Names") + show_menu.add_command(label="IPv4 Addresses") + show_menu.add_command(label="IPv6 Addresses") + show_menu.add_command(label="Node Labels") + show_menu.add_command(label="Annotations") + show_menu.add_command(label="Grid") + show_menu.add_command(label="API Messages") + + view_menu.add_cascade(label="Show", menu=show_menu) + + def create_view_menu(self): + """ + Create view menu + + :return: nothing + """ + view_menu = tk.Menu(self.master) + self.create_show_menu(view_menu) + view_menu.add_command( + label="Show hidden nodes", command=action.view_show_hidden_nodes + ) + view_menu.add_command(label="Locked", command=action.view_locked) + view_menu.add_command(label="3D GUI...", command=action.view_3d_gui) + + view_menu.add_separator() + + view_menu.add_command( + label="Zoom in", command=action.view_zoom_in, accelerator="+" + ) + view_menu.add_command( + label="Zoom out", command=action.view_zoom_out, accelerator="-" + ) + + self.menubar.add_cascade(label="View", menu=view_menu) + + def create_experimental_menu(self, tools_menu): + experimental_menu = tk.Menu(self.master) + experimental_menu.add_command(label="Plugins...") + experimental_menu.add_command(label="ns2immunes converter...") + experimental_menu.add_command(label="Topology partitioning...") + + tools_menu.add_cascade(label="Experimental", menu=experimental_menu) + + def create_random_menu(self, topology_generator_menu): + """ + Create random menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + random_menu = tk.Menu(self.master) + random_menu.add_command(label="R(1)") + random_menu.add_command(label="R(5)") + random_menu.add_command(label="R(10)") + random_menu.add_command(label="R(15)") + random_menu.add_command(label="R(20)") + random_menu.add_command(label="R(30)") + random_menu.add_command(label="R(40)") + random_menu.add_command(label="R(50)") + random_menu.add_command(label="R(75)") + random_menu.add_command(label="R(100)") + + topology_generator_menu.add_cascade(label="Random", menu=random_menu) + + def create_grid_menu(self, topology_generator_menu): + """ + Create grid menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology_generator_menu + :return: nothing + """ + grid_menu = tk.Menu(self.master) + grid_menu.add_command(label="G(1)") + grid_menu.add_command(label="G(5)") + grid_menu.add_command(label="G(10)") + grid_menu.add_command(label="G(15)") + grid_menu.add_command(label="G(20)") + grid_menu.add_command(label="G(25)") + grid_menu.add_command(label="G(30)") + grid_menu.add_command(label="G(35)") + grid_menu.add_command(label="G(40)") + grid_menu.add_command(label="G(50)") + grid_menu.add_command(label="G(60)") + grid_menu.add_command(label="G(70)") + grid_menu.add_command(label="G(80)") + grid_menu.add_command(label="G(90)") + grid_menu.add_command(label="G(100)") + + topology_generator_menu.add_cascade(label="Grid", menu=grid_menu) + + # TODO do later + def create_connected_grid_menu(self, topology_generator_menu): + """ + Create connected grid menu items and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + return + + def create_chain_menu(self, topology_generator_menu): + """ + Create chain menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + chain_menu = tk.Menu(self.master) + chain_menu.add_command(label="P(2)") + chain_menu.add_command(label="P(3)") + chain_menu.add_command(label="P(4)") + chain_menu.add_command(label="P(5)") + chain_menu.add_command(label="P(6)") + chain_menu.add_command(label="P(7)") + chain_menu.add_command(label="P(8)") + chain_menu.add_command(label="P(9)") + chain_menu.add_command(label="P(10)") + chain_menu.add_command(label="P(11)") + chain_menu.add_command(label="P(12)") + chain_menu.add_command(label="P(13)") + chain_menu.add_command(label="P(14)") + chain_menu.add_command(label="P(15)") + chain_menu.add_command(label="P(16)") + chain_menu.add_command(label="P(17)") + chain_menu.add_command(label="P(18)") + chain_menu.add_command(label="P(19)") + chain_menu.add_command(label="P(20)") + chain_menu.add_command(label="P(21)") + chain_menu.add_command(label="P(22)") + chain_menu.add_command(label="P(23)") + chain_menu.add_command(label="P(24)") + chain_menu.add_command(label="P(32)") + chain_menu.add_command(label="P(64)") + chain_menu.add_command(label="P(128)") + topology_generator_menu.add_cascade(label="Chain", menu=chain_menu) + + def create_star_menu(self, topology_generator_menu): + """ + Create star menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + star_menu = tk.Menu(self.master) + for i in range(3, 26, 1): + the_label = "C(" + str(i) + ")" + star_menu.add_command(label=the_label) + + topology_generator_menu.add_cascade(label="Star", menu=star_menu) + + def create_cycle_menu(self, topology_generator_menu): + """ + Create cycle menu item and the sub items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + cycle_menu = tk.Menu(self.master) + for i in range(3, 25, 1): + the_label = "C(" + str(i) + ")" + cycle_menu.add_command(label=the_label) + + topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu) + + def create_wheel_menu(self, topology_generator_menu): + """ + Create wheel menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + wheel_menu = tk.Menu(self.master) + for i in range(4, 26, 1): + the_label = "W(" + str(i) + ")" + wheel_menu.add_command(label=the_label) + + topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu) + + def create_cube_menu(self, topology_generator_menu): + """ + Create cube menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + cube_menu = tk.Menu(self.master) + for i in range(2, 7, 1): + the_label = "Q(" + str(i) + ")" + cube_menu.add_command(label=the_label) + + topology_generator_menu.add_cascade(label="Cube", menu=cube_menu) + + def create_clique_menu(self, topology_generator_menu): + """ + Create clique menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology generator menu + :return: nothing + """ + clique_menu = tk.Menu(self.master) + for i in range(3, 25, 1): + the_label = "K(" + str(i) + ")" + clique_menu.add_command(label=the_label) + + topology_generator_menu.add_cascade(label="Clique", menu=clique_menu) + + # TODO do later + def create_bipartite_menu(self, topology_generator_menu): + """ + Create bipartite menu item and the sub menu items inside + + :param tkinter.Menu topology_generator_menu: topology_generator_menu + :return: nothing + """ + # bipartite_menu = tk.Menu(self.master) + return + + def create_topology_generator_menu(self, tools_menu): + """ + Create topology menu item and its sub menu items + + :param tkinter.Menu tools_menu: tools menu + + :return: nothing + """ + topology_generator_menu = tk.Menu(self.master) + # topology_generator_menu.add_command(label="Random") + self.create_random_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Grid") + self.create_grid_menu(topology_generator_menu) + topology_generator_menu.add_command(label="Connected Grid") + self.create_chain_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Chain") + # topology_generator_menu.add_command(label="Star") + self.create_star_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Cycle") + self.create_cycle_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Wheel") + self.create_wheel_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Cube") + self.create_cube_menu(topology_generator_menu) + # topology_generator_menu.add_command(label="Clique") + self.create_clique_menu(topology_generator_menu) + topology_generator_menu.add_command(label="Bipartite") + + tools_menu.add_cascade(label="Topology generator", menu=topology_generator_menu) + + def create_tools_menu(self): + """ + Create tools menu + + :return: nothing + """ + + tools_menu = tk.Menu(self.master) + tools_menu.add_command( + label="Auto rearrange all", command=action.tools_auto_rearrange_all + ) + tools_menu.add_command( + label="Auto rearrange selected", + command=action.tools_auto_rearrange_selected, + ) + tools_menu.add_separator() + + tools_menu.add_command( + label="Align to grid", command=action.tools_align_to_grid + ) + + tools_menu.add_separator() + + tools_menu.add_command(label="Traffic...", command=action.tools_traffic) + tools_menu.add_command( + label="IP addresses...", command=action.tools_ip_addresses + ) + tools_menu.add_command( + label="MAC addresses...", command=action.tools_mac_addresses + ) + tools_menu.add_command( + label="Build hosts file...", command=action.tools_build_hosts_file + ) + tools_menu.add_command( + label="Renumber nodes...", command=action.tools_renumber_nodes + ) + self.create_experimental_menu(tools_menu) + self.create_topology_generator_menu(tools_menu) + tools_menu.add_command(label="Debugger...", command=action.tools_debugger) + + self.menubar.add_cascade(label="Tools", menu=tools_menu) + + def create_observer_widgets_menu(self, widget_menu): + """ + Create observer widget menu item and create the sub menu items inside + + :param tkinter.Menu widget_menu: widget_menu + :return: nothing + """ + observer_widget_menu = tk.Menu(self.master) + observer_widget_menu.add_command(label="None") + observer_widget_menu.add_command(label="processes") + observer_widget_menu.add_command(label="ifconfig") + observer_widget_menu.add_command(label="IPv4 routes") + observer_widget_menu.add_command(label="IPv6 routes") + observer_widget_menu.add_command(label="OSPFv2 neighbors") + observer_widget_menu.add_command(label="OSPFv3 neighbors") + observer_widget_menu.add_command(label="Listening sockets") + observer_widget_menu.add_command(label="IPv4 MFC entries") + observer_widget_menu.add_command(label="IPv6 MFC entries") + observer_widget_menu.add_command(label="firewall rules") + observer_widget_menu.add_command(label="IPsec policies") + observer_widget_menu.add_command(label="docker logs") + observer_widget_menu.add_command(label="OSPFv3 MDR level") + observer_widget_menu.add_command(label="PIM neighbors") + observer_widget_menu.add_command(label="Edit...") + + widget_menu.add_cascade(label="Observer Widgets", menu=observer_widget_menu) + + def create_adjacency_menu(self, widget_menu): + """ + Create adjacency menu item and the sub menu items inside + + :param tkinter.Menu widget_menu: widget menu + :return: nothing + """ + adjacency_menu = tk.Menu(self.master) + adjacency_menu.add_command(label="OSPFv2") + adjacency_menu.add_command(label="OSPFv3") + adjacency_menu.add_command(label="OSLR") + adjacency_menu.add_command(label="OSLRv2") + + widget_menu.add_cascade(label="Adjacency", menu=adjacency_menu) + + def create_widgets_menu(self): + """ + Create widget menu + + :return: nothing + """ + widget_menu = tk.Menu(self.master) + self.create_observer_widgets_menu(widget_menu) + self.create_adjacency_menu(widget_menu) + widget_menu.add_command(label="Throughput", command=action.widgets_throughput) + + widget_menu.add_separator() + + widget_menu.add_command( + label="Configure Adjacency...", command=action.widgets_configure_adjacency + ) + widget_menu.add_command( + label="Configure Throughput...", command=action.widgets_configure_throughput + ) + + self.menubar.add_cascade(label="Widgets", menu=widget_menu) + + def create_session_menu(self): + """ + Create session menu + + :return: nothing + """ + session_menu = tk.Menu(self.master) + session_menu.add_command(label="Start", command=action.session_start) + session_menu.add_command( + label="Change sessions...", command=action.session_change_sessions + ) + + session_menu.add_separator() + + session_menu.add_command( + label="Node types...", command=action.session_node_types + ) + session_menu.add_command(label="Comments...", command=action.session_comments) + session_menu.add_command(label="Hooks...", command=action.session_hooks) + session_menu.add_command( + label="Reset node positions", command=action.session_reset_node_positions + ) + session_menu.add_command( + label="Emulation servers...", command=action.session_emulation_servers + ) + session_menu.add_command(label="Options...", command=action.session_options) + + self.menubar.add_cascade(label="Session", menu=session_menu) + + def create_help_menu(self): + """ + Create help menu + + :return: nothing + """ + help_menu = tk.Menu(self.master) + help_menu.add_command( + label="Core Github (www)", command=action.help_core_github + ) + help_menu.add_command( + label="Core Documentation (www)", command=action.help_core_documentation + ) + help_menu.add_command(label="About", command=action.help_about) + + self.menubar.add_cascade(label="Help", menu=help_menu) + + def bind_menubar_shortcut(self): + self.bind_all("", action.file_new_shortcut) + self.bind_all("", action.file_open_shortcut) + self.bind_all("", action.file_save_shortcut) + self.bind_all("", action.edit_undo_shortcut) + self.bind_all("", action.edit_redo_shortcut) + self.bind_all("", action.edit_cut_shortcut) + self.bind_all("", action.edit_copy_shortcut) + self.bind_all("", action.edit_paste_shortcut) + self.bind_all("", action.edit_select_all_shortcut) + self.bind_all("", action.edit_select_adjacent_shortcut) + self.bind_all("", action.edit_find_shortcut) + self.bind_all("", action.canvas_previous_shortcut) + self.bind_all("", action.canvas_next_shortcut) + self.bind_all("", action.canvas_first_shortcut) + self.bind_all("", action.canvas_last_shortcut) + self.bind_all("", action.view_zoom_in_shortcut) + self.bind_all("", action.view_zoom_out_shortcut) + def create_menu(self): self.master.option_add("*tearOff", tk.FALSE) self.menubar = tk.Menu(self.master) - file_menu = tk.Menu(self.menubar) - file_menu.add_command(label="Open") - file_menu.add_command(label="Exit", command=self.master.quit) - self.menubar.add_cascade(label="File", menu=file_menu) - help_menu = tk.Menu(self.menubar) - self.menubar.add_cascade(label="Help", menu=help_menu) + self.create_file_menu() + self.create_edit_menu() + self.create_canvas_menu() + self.create_view_menu() + self.create_tools_menu() + self.create_widgets_menu() + self.create_session_menu() + self.create_help_menu() + self.master.config(menu=self.menubar) + self.bind_menubar_shortcut() def create_widgets(self): image = Images.get("switch") diff --git a/coretk/coretk/menuaction.py b/coretk/coretk/menuaction.py new file mode 100644 index 00000000..005776f9 --- /dev/null +++ b/coretk/coretk/menuaction.py @@ -0,0 +1,334 @@ +""" +The actions taken when each menubar option is clicked +""" + +import logging +import webbrowser + + +def file_new(): + logging.debug("Click file New") + + +def file_new_shortcut(event): + logging.debug("Shortcut for file new shortcut") + + +def file_open(): + logging.debug("Click file Open") + + +def file_open_shortcut(event): + logging.debug("Shortcut for file open") + + +def file_reload(): + logging.debug("Click file Reload") + + +def file_save(): + logging.debug("Click file save") + + +def file_save_shortcut(event): + logging.debug("Shortcut for file save") + + +def file_save_as_xml(): + logging.debug("Click save as XML") + + +def file_save_as_imn(): + logging.debug("Click save as imn") + + +def file_export_python_script(): + logging.debug("Click file export python script") + + +def file_execute_xml_or_python_script(): + logging.debug("Execute XML or Python script") + + +def file_execute_python_script_with_options(): + logging.debug("Click execute Python script with options") + + +def file_open_current_file_in_editor(): + logging.debug("Click file open current in editor") + + +def file_print(): + logging.debug("Click file Print") + + +def file_save_screenshot(): + logging.debug("Click file save screenshot") + + +def file_example_link(): + logging.debug("Click file example link") + + +def edit_undo(): + logging.debug("Click edit undo") + + +def edit_undo_shortcut(event): + logging.debug("Shortcut for edit undo") + + +def edit_redo(): + logging.debug("Click edit redo") + + +def edit_redo_shortcut(event): + logging.debug("Shortcut for edit redo") + + +def edit_cut(): + logging.debug("Click edit cut") + + +def edit_cut_shortcut(event): + logging.debug("Shortcut for edit cut") + + +def edit_copy(): + logging.debug("Click edit copy") + + +def edit_copy_shortcut(event): + logging.debug("Shortcut for edit copy") + + +def edit_paste(): + logging.debug("Click edit paste") + + +def edit_paste_shortcut(event): + logging.debug("Shortcut for edit paste") + + +def edit_select_all(): + logging.debug("Click edit select all") + + +def edit_select_all_shortcut(event): + logging.debug("Shortcut for edit select all") + + +def edit_select_adjacent(): + logging.debug("Click edit select adjacent") + + +def edit_select_adjacent_shortcut(event): + logging.debug("Shortcut for edit select adjacent") + + +def edit_find(): + logging.debug("CLick edit find") + + +def edit_find_shortcut(event): + logging.debug("Shortcut for edit find") + + +def edit_clear_marker(): + logging.debug("Click edit clear marker") + + +def edit_preferences(): + logging.debug("Click preferences") + + +def canvas_new(): + logging.debug("Click canvas new") + + +def canvas_manage(): + logging.debug("Click canvas manage") + + +def canvas_delete(): + logging.debug("Click canvas delete") + + +def canvas_size_scale(): + logging.debug("Click canvas size/scale") + + +def canvas_wallpaper(): + logging.debug("CLick canvas wallpaper") + + +def canvas_previous(): + logging.debug("Click canvas previous") + + +def canvas_previous_shortcut(event): + logging.debug("Shortcut for canvas previous") + + +def canvas_next(): + logging.debug("Click canvas next") + + +def canvas_next_shortcut(event): + logging.debug("Shortcut for canvas next") + + +def canvas_first(): + logging.debug("CLick canvas first") + + +def canvas_first_shortcut(event): + logging.debug("Shortcut for canvas first") + + +def canvas_last(): + logging.debug("CLick canvas last") + + +def canvas_last_shortcut(event): + logging.debug("Shortcut canvas last") + + +def view_show(): + logging.debug("Click view show") + + +def view_show_hidden_nodes(): + logging.debug("Click view show hidden nodes") + + +def view_locked(): + logging.debug("Click view locked") + + +def view_3d_gui(): + logging.debug("CLick view 3D GUI") + + +def view_zoom_in(): + logging.debug("Click view zoom in") + + +def view_zoom_in_shortcut(event): + logging.debug("Shortcut view zoom in") + + +def view_zoom_out(): + logging.debug("Click view zoom out") + + +def view_zoom_out_shortcut(event): + logging.debug("Shortcut view zoom out") + + +def tools_auto_rearrange_all(): + logging.debug("Click tools, auto rearrange all") + + +def tools_auto_rearrange_selected(): + logging.debug("CLick tools auto rearrange selected") + + +def tools_align_to_grid(): + logging.debug("Click tools align to grid") + + +def tools_traffic(): + logging.debug("Click tools traffic") + + +def tools_ip_addresses(): + logging.debug("Click tools ip addresses") + + +def tools_mac_addresses(): + logging.debug("Click tools mac addresses") + + +def tools_build_hosts_file(): + logging.debug("Click tools build hosts file") + + +def tools_renumber_nodes(): + logging.debug("Click tools renumber nodes") + + +def tools_experimental(): + logging.debug("Click tools experimental") + + +def tools_topology_generator(): + logging.debug("Click tools topology generator") + + +def tools_debugger(): + logging.debug("Click tools debugger") + + +def widgets_observer_widgets(): + logging.debug("Click widgets observer widgets") + + +def widgets_adjacency(): + logging.debug("Click widgets adjacency") + + +def widgets_throughput(): + logging.debug("Click widgets throughput") + + +def widgets_configure_adjacency(): + logging.debug("Click widgets configure adjacency") + + +def widgets_configure_throughput(): + logging.debug("Click widgets configure throughput") + + +def session_start(): + logging.debug("Click session start") + + +def session_change_sessions(): + logging.debug("Click session change sessions") + + +def session_node_types(): + logging.debug("Click session node types") + + +def session_comments(): + logging.debug("Click session comments") + + +def session_hooks(): + logging.debug("Click session hooks") + + +def session_reset_node_positions(): + logging.debug("Click session reset node positions") + + +def session_emulation_servers(): + logging.debug("Click session emulation servers") + + +def session_options(): + logging.debug("Click session options") + + +def help_core_github(): + webbrowser.open_new("https://github.com/coreemu/core") + + +def help_core_documentation(): + webbrowser.open_new("http://coreemu.github.io/core/") + + +def help_about(): + logging.debug("Click help About") From 303e96cdd6c59ddf844bc2aadf29e10e9ac433b0 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Fri, 20 Sep 2019 10:45:35 -0700 Subject: [PATCH 2/4] finish up menubar --- coretk/coretk/app.py | 266 +++++++++++++++++++----------------- coretk/coretk/menuaction.py | 4 + 2 files changed, 146 insertions(+), 124 deletions(-) diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index 8e023cac..bd0fd680 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -32,7 +32,7 @@ class Application(tk.Frame): :return: nothing """ - file_menu = tk.Menu(self.master) + file_menu = tk.Menu(self.menubar) file_menu.add_command( label="New", command=action.file_new, accelerator="Ctrl+N" ) @@ -89,7 +89,7 @@ class Application(tk.Frame): :return: nothing """ - edit_menu = tk.Menu(self.master) + edit_menu = tk.Menu(self.menubar) edit_menu.add_command( label="Undo", command=action.edit_undo, accelerator="Ctrl+Z" ) @@ -136,7 +136,7 @@ class Application(tk.Frame): :return: nothing """ - canvas_menu = tk.Menu(self.master) + canvas_menu = tk.Menu(self.menubar) canvas_menu.add_command(label="New", command=action.canvas_new) canvas_menu.add_command(label="Manage...", command=action.canvas_manage) canvas_menu.add_command(label="Delete", command=action.canvas_delete) @@ -170,17 +170,17 @@ class Application(tk.Frame): :param tkinter.Menu view_menu: the view menu :return: nothing """ - show_menu = tk.Menu(self.master) - show_menu.add_command(label="All") - show_menu.add_command(label="None") + show_menu = tk.Menu(view_menu) + show_menu.add_command(label="All", command=action.sub_menu_items) + show_menu.add_command(label="None", command=action.sub_menu_items) show_menu.add_separator() - show_menu.add_command(label="Interface Names") - show_menu.add_command(label="IPv4 Addresses") - show_menu.add_command(label="IPv6 Addresses") - show_menu.add_command(label="Node Labels") - show_menu.add_command(label="Annotations") - show_menu.add_command(label="Grid") - show_menu.add_command(label="API Messages") + show_menu.add_command(label="Interface Names", command=action.sub_menu_items) + show_menu.add_command(label="IPv4 Addresses", command=action.sub_menu_items) + show_menu.add_command(label="IPv6 Addresses", command=action.sub_menu_items) + show_menu.add_command(label="Node Labels", command=action.sub_menu_items) + show_menu.add_command(label="Annotations", command=action.sub_menu_items) + show_menu.add_command(label="Grid", command=action.sub_menu_items) + show_menu.add_command(label="API Messages", command=action.sub_menu_items) view_menu.add_cascade(label="Show", menu=show_menu) @@ -190,7 +190,7 @@ class Application(tk.Frame): :return: nothing """ - view_menu = tk.Menu(self.master) + view_menu = tk.Menu(self.menubar, tearoff=True) self.create_show_menu(view_menu) view_menu.add_command( label="Show hidden nodes", command=action.view_show_hidden_nodes @@ -210,10 +210,20 @@ class Application(tk.Frame): self.menubar.add_cascade(label="View", menu=view_menu) def create_experimental_menu(self, tools_menu): - experimental_menu = tk.Menu(self.master) - experimental_menu.add_command(label="Plugins...") - experimental_menu.add_command(label="ns2immunes converter...") - experimental_menu.add_command(label="Topology partitioning...") + """ + Create experimental menu item and the sub menu items inside + + :param tkinter.Menu tools_menu: tools menu + :return: nothing + """ + experimental_menu = tk.Menu(tools_menu, tearoff=True) + experimental_menu.add_command(label="Plugins...", command=action.sub_menu_items) + experimental_menu.add_command( + label="ns2immunes converter...", command=action.sub_menu_items + ) + experimental_menu.add_command( + label="Topology partitioning...", command=action.sub_menu_items + ) tools_menu.add_cascade(label="Experimental", menu=experimental_menu) @@ -224,17 +234,12 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - random_menu = tk.Menu(self.master) - random_menu.add_command(label="R(1)") - random_menu.add_command(label="R(5)") - random_menu.add_command(label="R(10)") - random_menu.add_command(label="R(15)") - random_menu.add_command(label="R(20)") - random_menu.add_command(label="R(30)") - random_menu.add_command(label="R(40)") - random_menu.add_command(label="R(50)") - random_menu.add_command(label="R(75)") - random_menu.add_command(label="R(100)") + random_menu = tk.Menu(topology_generator_menu) + # list of number of random nodes to create + nums = [1, 5, 10, 15, 20, 30, 40, 50, 75, 100] + for i in nums: + the_label = "R(" + str(i) + ")" + random_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Random", menu=random_menu) @@ -245,26 +250,17 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology_generator_menu :return: nothing """ - grid_menu = tk.Menu(self.master) - grid_menu.add_command(label="G(1)") - grid_menu.add_command(label="G(5)") - grid_menu.add_command(label="G(10)") - grid_menu.add_command(label="G(15)") - grid_menu.add_command(label="G(20)") - grid_menu.add_command(label="G(25)") - grid_menu.add_command(label="G(30)") - grid_menu.add_command(label="G(35)") - grid_menu.add_command(label="G(40)") - grid_menu.add_command(label="G(50)") - grid_menu.add_command(label="G(60)") - grid_menu.add_command(label="G(70)") - grid_menu.add_command(label="G(80)") - grid_menu.add_command(label="G(90)") - grid_menu.add_command(label="G(100)") + grid_menu = tk.Menu(topology_generator_menu) + + # list of number of nodes to create + nums = [1, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 90, 100] + + for i in nums: + the_label = "G(" + str(i) + ")" + grid_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Grid", menu=grid_menu) - # TODO do later def create_connected_grid_menu(self, topology_generator_menu): """ Create connected grid menu items and the sub menu items inside @@ -272,7 +268,15 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - return + grid_menu = tk.Menu(topology_generator_menu) + for i in range(1, 11, 1): + i_n_menu = tk.Menu(grid_menu) + for j in range(1, 11, 1): + i_j_label = str(i) + " X " + str(j) + i_n_menu.add_command(label=i_j_label, command=action.sub_menu_items) + i_n_label = str(i) + " X N" + grid_menu.add_cascade(label=i_n_label, menu=i_n_menu) + topology_generator_menu.add_cascade(label="Connected Grid", menu=grid_menu) def create_chain_menu(self, topology_generator_menu): """ @@ -281,33 +285,13 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - chain_menu = tk.Menu(self.master) - chain_menu.add_command(label="P(2)") - chain_menu.add_command(label="P(3)") - chain_menu.add_command(label="P(4)") - chain_menu.add_command(label="P(5)") - chain_menu.add_command(label="P(6)") - chain_menu.add_command(label="P(7)") - chain_menu.add_command(label="P(8)") - chain_menu.add_command(label="P(9)") - chain_menu.add_command(label="P(10)") - chain_menu.add_command(label="P(11)") - chain_menu.add_command(label="P(12)") - chain_menu.add_command(label="P(13)") - chain_menu.add_command(label="P(14)") - chain_menu.add_command(label="P(15)") - chain_menu.add_command(label="P(16)") - chain_menu.add_command(label="P(17)") - chain_menu.add_command(label="P(18)") - chain_menu.add_command(label="P(19)") - chain_menu.add_command(label="P(20)") - chain_menu.add_command(label="P(21)") - chain_menu.add_command(label="P(22)") - chain_menu.add_command(label="P(23)") - chain_menu.add_command(label="P(24)") - chain_menu.add_command(label="P(32)") - chain_menu.add_command(label="P(64)") - chain_menu.add_command(label="P(128)") + chain_menu = tk.Menu(topology_generator_menu) + # number of nodes to create + nums = list(range(2, 25, 1)) + [32, 64, 128] + for i in nums: + the_label = "P(" + str(i) + ")" + chain_menu.add_command(label=the_label, command=action.sub_menu_items) + topology_generator_menu.add_cascade(label="Chain", menu=chain_menu) def create_star_menu(self, topology_generator_menu): @@ -317,10 +301,10 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - star_menu = tk.Menu(self.master) + star_menu = tk.Menu(topology_generator_menu) for i in range(3, 26, 1): the_label = "C(" + str(i) + ")" - star_menu.add_command(label=the_label) + star_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Star", menu=star_menu) @@ -331,10 +315,10 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - cycle_menu = tk.Menu(self.master) + cycle_menu = tk.Menu(topology_generator_menu) for i in range(3, 25, 1): the_label = "C(" + str(i) + ")" - cycle_menu.add_command(label=the_label) + cycle_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu) @@ -345,10 +329,10 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - wheel_menu = tk.Menu(self.master) + wheel_menu = tk.Menu(topology_generator_menu) for i in range(4, 26, 1): the_label = "W(" + str(i) + ")" - wheel_menu.add_command(label=the_label) + wheel_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu) @@ -359,10 +343,10 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - cube_menu = tk.Menu(self.master) + cube_menu = tk.Menu(topology_generator_menu) for i in range(2, 7, 1): the_label = "Q(" + str(i) + ")" - cube_menu.add_command(label=the_label) + cube_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Cube", menu=cube_menu) @@ -373,14 +357,13 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology generator menu :return: nothing """ - clique_menu = tk.Menu(self.master) + clique_menu = tk.Menu(topology_generator_menu) for i in range(3, 25, 1): the_label = "K(" + str(i) + ")" - clique_menu.add_command(label=the_label) + clique_menu.add_command(label=the_label, command=action.sub_menu_items) topology_generator_menu.add_cascade(label="Clique", menu=clique_menu) - # TODO do later def create_bipartite_menu(self, topology_generator_menu): """ Create bipartite menu item and the sub menu items inside @@ -388,8 +371,17 @@ class Application(tk.Frame): :param tkinter.Menu topology_generator_menu: topology_generator_menu :return: nothing """ - # bipartite_menu = tk.Menu(self.master) - return + bipartite_menu = tk.Menu(topology_generator_menu) + temp = 24 + for i in range(1, 13, 1): + i_n_menu = tk.Menu(bipartite_menu) + for j in range(i, temp, 1): + i_j_label = "K(" + str(i) + " X " + str(j) + ")" + i_n_menu.add_command(label=i_j_label, command=action.sub_menu_items) + i_n_label = "K(" + str(i) + " X N)" + bipartite_menu.add_cascade(label=i_n_label, menu=i_n_menu) + temp = temp - 1 + topology_generator_menu.add_cascade(label="Bipartite", menu=bipartite_menu) def create_topology_generator_menu(self, tools_menu): """ @@ -399,25 +391,18 @@ class Application(tk.Frame): :return: nothing """ - topology_generator_menu = tk.Menu(self.master) - # topology_generator_menu.add_command(label="Random") + topology_generator_menu = tk.Menu(tools_menu, tearoff=True) + self.create_random_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Grid") self.create_grid_menu(topology_generator_menu) - topology_generator_menu.add_command(label="Connected Grid") + self.create_connected_grid_menu(topology_generator_menu) self.create_chain_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Chain") - # topology_generator_menu.add_command(label="Star") self.create_star_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Cycle") self.create_cycle_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Wheel") self.create_wheel_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Cube") self.create_cube_menu(topology_generator_menu) - # topology_generator_menu.add_command(label="Clique") self.create_clique_menu(topology_generator_menu) - topology_generator_menu.add_command(label="Bipartite") + self.create_bipartite_menu(topology_generator_menu) tools_menu.add_cascade(label="Topology generator", menu=topology_generator_menu) @@ -428,7 +413,7 @@ class Application(tk.Frame): :return: nothing """ - tools_menu = tk.Menu(self.master) + tools_menu = tk.Menu(self.menubar) tools_menu.add_command( label="Auto rearrange all", command=action.tools_auto_rearrange_all ) @@ -470,23 +455,51 @@ class Application(tk.Frame): :param tkinter.Menu widget_menu: widget_menu :return: nothing """ - observer_widget_menu = tk.Menu(self.master) - observer_widget_menu.add_command(label="None") - observer_widget_menu.add_command(label="processes") - observer_widget_menu.add_command(label="ifconfig") - observer_widget_menu.add_command(label="IPv4 routes") - observer_widget_menu.add_command(label="IPv6 routes") - observer_widget_menu.add_command(label="OSPFv2 neighbors") - observer_widget_menu.add_command(label="OSPFv3 neighbors") - observer_widget_menu.add_command(label="Listening sockets") - observer_widget_menu.add_command(label="IPv4 MFC entries") - observer_widget_menu.add_command(label="IPv6 MFC entries") - observer_widget_menu.add_command(label="firewall rules") - observer_widget_menu.add_command(label="IPsec policies") - observer_widget_menu.add_command(label="docker logs") - observer_widget_menu.add_command(label="OSPFv3 MDR level") - observer_widget_menu.add_command(label="PIM neighbors") - observer_widget_menu.add_command(label="Edit...") + observer_widget_menu = tk.Menu(widget_menu, tearoff=True) + observer_widget_menu.add_command(label="None", command=action.sub_menu_items) + observer_widget_menu.add_command( + label="processes", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="ifconfig", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="IPv4 routes", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="IPv6 routes", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="OSPFv2 neighbors", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="OSPFv3 neighbors", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="Listening sockets", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="IPv4 MFC entries", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="IPv6 MFC entries", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="firewall rules", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="IPsec policies", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="docker logs", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="OSPFv3 MDR level", command=action.sub_menu_items + ) + observer_widget_menu.add_command( + label="PIM neighbors", command=action.sub_menu_items + ) + observer_widget_menu.add_command(label="Edit...", command=action.sub_menu_items) widget_menu.add_cascade(label="Observer Widgets", menu=observer_widget_menu) @@ -497,11 +510,11 @@ class Application(tk.Frame): :param tkinter.Menu widget_menu: widget menu :return: nothing """ - adjacency_menu = tk.Menu(self.master) - adjacency_menu.add_command(label="OSPFv2") - adjacency_menu.add_command(label="OSPFv3") - adjacency_menu.add_command(label="OSLR") - adjacency_menu.add_command(label="OSLRv2") + adjacency_menu = tk.Menu(widget_menu, tearoff=True) + adjacency_menu.add_command(label="OSPFv2", command=action.sub_menu_items) + adjacency_menu.add_command(label="OSPFv3", command=action.sub_menu_items) + adjacency_menu.add_command(label="OSLR", command=action.sub_menu_items) + adjacency_menu.add_command(label="OSLRv2", command=action.sub_menu_items) widget_menu.add_cascade(label="Adjacency", menu=adjacency_menu) @@ -511,7 +524,7 @@ class Application(tk.Frame): :return: nothing """ - widget_menu = tk.Menu(self.master) + widget_menu = tk.Menu(self.menubar, tearoff=True) self.create_observer_widgets_menu(widget_menu) self.create_adjacency_menu(widget_menu) widget_menu.add_command(label="Throughput", command=action.widgets_throughput) @@ -533,7 +546,7 @@ class Application(tk.Frame): :return: nothing """ - session_menu = tk.Menu(self.master) + session_menu = tk.Menu(self.menubar, tearoff=True) session_menu.add_command(label="Start", command=action.session_start) session_menu.add_command( label="Change sessions...", command=action.session_change_sessions @@ -562,7 +575,7 @@ class Application(tk.Frame): :return: nothing """ - help_menu = tk.Menu(self.master) + help_menu = tk.Menu(self.menubar) help_menu.add_command( label="Core Github (www)", command=action.help_core_github ) @@ -574,6 +587,11 @@ class Application(tk.Frame): self.menubar.add_cascade(label="Help", menu=help_menu) def bind_menubar_shortcut(self): + """ + Bind hot keys to matching command + + :return: nothing + """ self.bind_all("", action.file_new_shortcut) self.bind_all("", action.file_open_shortcut) self.bind_all("", action.file_save_shortcut) diff --git a/coretk/coretk/menuaction.py b/coretk/coretk/menuaction.py index 005776f9..2e1427da 100644 --- a/coretk/coretk/menuaction.py +++ b/coretk/coretk/menuaction.py @@ -6,6 +6,10 @@ import logging import webbrowser +def sub_menu_items(): + logging.debug("Click on sub menu items") + + def file_new(): logging.debug("Click file New") From 01a919eb23552b0808c5692e36896263017809c4 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Fri, 20 Sep 2019 13:33:42 -0700 Subject: [PATCH 3/4] finish up menubar --- coretk/coretk/app.py | 131 +++++++++++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 49 deletions(-) diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index bd0fd680..f1593662 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -34,14 +34,14 @@ class Application(tk.Frame): """ file_menu = tk.Menu(self.menubar) file_menu.add_command( - label="New", command=action.file_new, accelerator="Ctrl+N" + label="New", command=action.file_new, accelerator="Ctrl+N", underline=0 ) file_menu.add_command( - label="Open...", command=action.file_open, accelerator="Ctrl+O" + label="Open...", command=action.file_open, accelerator="Ctrl+O", underline=0 ) - file_menu.add_command(label="Reload", command=action.file_reload) + file_menu.add_command(label="Reload", command=action.file_reload, underline=0) file_menu.add_command( - label="Save", command=action.file_save, accelerator="Ctrl+S" + label="Save", command=action.file_save, accelerator="Ctrl+S", underline=0 ) file_menu.add_command(label="Save As XML...", command=action.file_save_as_xml) file_menu.add_command(label="Save As imn...", command=action.file_save_as_imn) @@ -66,7 +66,7 @@ class Application(tk.Frame): label="Open current file in editor...", command=action.file_open_current_file_in_editor, ) - file_menu.add_command(label="Print...", command=action.file_print) + file_menu.add_command(label="Print...", command=action.file_print, underline=0) file_menu.add_command( label="Save screenshot...", command=action.file_save_screenshot ) @@ -80,8 +80,8 @@ class Application(tk.Frame): file_menu.add_separator() - file_menu.add_command(label="Quit", command=self.master.quit) - self.menubar.add_cascade(label="File", menu=file_menu) + file_menu.add_command(label="Quit", command=self.master.quit, underline=0) + self.menubar.add_cascade(label="File", menu=file_menu, underline=0) def create_edit_menu(self): """ @@ -91,22 +91,22 @@ class Application(tk.Frame): """ edit_menu = tk.Menu(self.menubar) edit_menu.add_command( - label="Undo", command=action.edit_undo, accelerator="Ctrl+Z" + label="Undo", command=action.edit_undo, accelerator="Ctrl+Z", underline=0 ) edit_menu.add_command( - label="Redo", command=action.edit_redo, accelerator="Ctrl+Y" + label="Redo", command=action.edit_redo, accelerator="Ctrl+Y", underline=0 ) edit_menu.add_separator() edit_menu.add_command( - label="Cut", command=action.edit_cut, accelerator="Ctrl+X" + label="Cut", command=action.edit_cut, accelerator="Ctrl+X", underline=0 ) edit_menu.add_command( - label="Copy", command=action.edit_copy, accelerator="Ctrl+C" + label="Copy", command=action.edit_copy, accelerator="Ctrl+C", underline=0 ) edit_menu.add_command( - label="Paste", command=action.edit_paste, accelerator="Ctrl+V" + label="Paste", command=action.edit_paste, accelerator="Ctrl+V", underline=0 ) edit_menu.add_separator() @@ -123,12 +123,12 @@ class Application(tk.Frame): edit_menu.add_separator() edit_menu.add_command( - label="Find...", command=action.edit_find, accelerator="Ctrl+F" + label="Find...", command=action.edit_find, accelerator="Ctrl+F", underline=0 ) edit_menu.add_command(label="Clear marker", command=action.edit_clear_marker) edit_menu.add_command(label="Preferences...", command=action.edit_preferences) - self.menubar.add_cascade(label="Edit", menu=edit_menu) + self.menubar.add_cascade(label="Edit", menu=edit_menu, underline=0) def create_canvas_menu(self): """ @@ -161,7 +161,7 @@ class Application(tk.Frame): label="Last", command=action.canvas_last, accelerator="End" ) - self.menubar.add_cascade(label="Canvas", menu=canvas_menu) + self.menubar.add_cascade(label="Canvas", menu=canvas_menu, underline=0) def create_show_menu(self, view_menu): """ @@ -207,7 +207,7 @@ class Application(tk.Frame): label="Zoom out", command=action.view_zoom_out, accelerator="-" ) - self.menubar.add_cascade(label="View", menu=view_menu) + self.menubar.add_cascade(label="View", menu=view_menu, underline=0) def create_experimental_menu(self, tools_menu): """ @@ -217,15 +217,19 @@ class Application(tk.Frame): :return: nothing """ experimental_menu = tk.Menu(tools_menu, tearoff=True) - experimental_menu.add_command(label="Plugins...", command=action.sub_menu_items) experimental_menu.add_command( - label="ns2immunes converter...", command=action.sub_menu_items + label="Plugins...", command=action.sub_menu_items, underline=0 + ) + experimental_menu.add_command( + label="ns2immunes converter...", command=action.sub_menu_items, underline=0 ) experimental_menu.add_command( label="Topology partitioning...", command=action.sub_menu_items ) - tools_menu.add_cascade(label="Experimental", menu=experimental_menu) + tools_menu.add_cascade( + label="Experimental", menu=experimental_menu, underline=0 + ) def create_random_menu(self, topology_generator_menu): """ @@ -241,7 +245,9 @@ class Application(tk.Frame): the_label = "R(" + str(i) + ")" random_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Random", menu=random_menu) + topology_generator_menu.add_cascade( + label="Random", menu=random_menu, underline=0 + ) def create_grid_menu(self, topology_generator_menu): """ @@ -259,7 +265,7 @@ class Application(tk.Frame): the_label = "G(" + str(i) + ")" grid_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Grid", menu=grid_menu) + topology_generator_menu.add_cascade(label="Grid", menu=grid_menu, underline=0) def create_connected_grid_menu(self, topology_generator_menu): """ @@ -276,7 +282,9 @@ class Application(tk.Frame): i_n_menu.add_command(label=i_j_label, command=action.sub_menu_items) i_n_label = str(i) + " X N" grid_menu.add_cascade(label=i_n_label, menu=i_n_menu) - topology_generator_menu.add_cascade(label="Connected Grid", menu=grid_menu) + topology_generator_menu.add_cascade( + label="Connected Grid", menu=grid_menu, underline=0 + ) def create_chain_menu(self, topology_generator_menu): """ @@ -292,7 +300,7 @@ class Application(tk.Frame): the_label = "P(" + str(i) + ")" chain_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Chain", menu=chain_menu) + topology_generator_menu.add_cascade(label="Chain", menu=chain_menu, underline=0) def create_star_menu(self, topology_generator_menu): """ @@ -306,7 +314,7 @@ class Application(tk.Frame): the_label = "C(" + str(i) + ")" star_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Star", menu=star_menu) + topology_generator_menu.add_cascade(label="Star", menu=star_menu, underline=0) def create_cycle_menu(self, topology_generator_menu): """ @@ -320,7 +328,7 @@ class Application(tk.Frame): the_label = "C(" + str(i) + ")" cycle_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu) + topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu, underline=0) def create_wheel_menu(self, topology_generator_menu): """ @@ -334,7 +342,7 @@ class Application(tk.Frame): the_label = "W(" + str(i) + ")" wheel_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu) + topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu, underline=0) def create_cube_menu(self, topology_generator_menu): """ @@ -348,7 +356,7 @@ class Application(tk.Frame): the_label = "Q(" + str(i) + ")" cube_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Cube", menu=cube_menu) + topology_generator_menu.add_cascade(label="Cube", menu=cube_menu, underline=0) def create_clique_menu(self, topology_generator_menu): """ @@ -362,7 +370,9 @@ class Application(tk.Frame): the_label = "K(" + str(i) + ")" clique_menu.add_command(label=the_label, command=action.sub_menu_items) - topology_generator_menu.add_cascade(label="Clique", menu=clique_menu) + topology_generator_menu.add_cascade( + label="Clique", menu=clique_menu, underline=0 + ) def create_bipartite_menu(self, topology_generator_menu): """ @@ -381,7 +391,9 @@ class Application(tk.Frame): i_n_label = "K(" + str(i) + " X N)" bipartite_menu.add_cascade(label=i_n_label, menu=i_n_menu) temp = temp - 1 - topology_generator_menu.add_cascade(label="Bipartite", menu=bipartite_menu) + topology_generator_menu.add_cascade( + label="Bipartite", menu=bipartite_menu, underline=0 + ) def create_topology_generator_menu(self, tools_menu): """ @@ -404,7 +416,9 @@ class Application(tk.Frame): self.create_clique_menu(topology_generator_menu) self.create_bipartite_menu(topology_generator_menu) - tools_menu.add_cascade(label="Topology generator", menu=topology_generator_menu) + tools_menu.add_cascade( + label="Topology generator", menu=topology_generator_menu, underline=0 + ) def create_tools_menu(self): """ @@ -415,38 +429,43 @@ class Application(tk.Frame): tools_menu = tk.Menu(self.menubar) tools_menu.add_command( - label="Auto rearrange all", command=action.tools_auto_rearrange_all + label="Auto rearrange all", + command=action.tools_auto_rearrange_all, + underline=0, ) tools_menu.add_command( label="Auto rearrange selected", command=action.tools_auto_rearrange_selected, + underline=0, ) tools_menu.add_separator() tools_menu.add_command( - label="Align to grid", command=action.tools_align_to_grid + label="Align to grid", command=action.tools_align_to_grid, underline=0 ) tools_menu.add_separator() tools_menu.add_command(label="Traffic...", command=action.tools_traffic) tools_menu.add_command( - label="IP addresses...", command=action.tools_ip_addresses + label="IP addresses...", command=action.tools_ip_addresses, underline=0 ) tools_menu.add_command( - label="MAC addresses...", command=action.tools_mac_addresses + label="MAC addresses...", command=action.tools_mac_addresses, underline=0 ) tools_menu.add_command( - label="Build hosts file...", command=action.tools_build_hosts_file + label="Build hosts file...", + command=action.tools_build_hosts_file, + underline=0, ) tools_menu.add_command( - label="Renumber nodes...", command=action.tools_renumber_nodes + label="Renumber nodes...", command=action.tools_renumber_nodes, underline=0 ) self.create_experimental_menu(tools_menu) self.create_topology_generator_menu(tools_menu) tools_menu.add_command(label="Debugger...", command=action.tools_debugger) - self.menubar.add_cascade(label="Tools", menu=tools_menu) + self.menubar.add_cascade(label="Tools", menu=tools_menu, underline=0) def create_observer_widgets_menu(self, widget_menu): """ @@ -538,7 +557,7 @@ class Application(tk.Frame): label="Configure Throughput...", command=action.widgets_configure_throughput ) - self.menubar.add_cascade(label="Widgets", menu=widget_menu) + self.menubar.add_cascade(label="Widgets", menu=widget_menu, underline=0) def create_session_menu(self): """ @@ -547,27 +566,41 @@ class Application(tk.Frame): :return: nothing """ session_menu = tk.Menu(self.menubar, tearoff=True) - session_menu.add_command(label="Start", command=action.session_start) session_menu.add_command( - label="Change sessions...", command=action.session_change_sessions + label="Start", command=action.session_start, underline=0 + ) + session_menu.add_command( + label="Change sessions...", + command=action.session_change_sessions, + underline=0, ) session_menu.add_separator() session_menu.add_command( - label="Node types...", command=action.session_node_types - ) - session_menu.add_command(label="Comments...", command=action.session_comments) - session_menu.add_command(label="Hooks...", command=action.session_hooks) - session_menu.add_command( - label="Reset node positions", command=action.session_reset_node_positions + label="Node types...", command=action.session_node_types, underline=0 ) session_menu.add_command( - label="Emulation servers...", command=action.session_emulation_servers + label="Comments...", command=action.session_comments, underline=0 + ) + session_menu.add_command( + label="Hooks...", command=action.session_hooks, underline=0 + ) + session_menu.add_command( + label="Reset node positions", + command=action.session_reset_node_positions, + underline=0, + ) + session_menu.add_command( + label="Emulation servers...", + command=action.session_emulation_servers, + underline=0, + ) + session_menu.add_command( + label="Options...", command=action.session_options, underline=0 ) - session_menu.add_command(label="Options...", command=action.session_options) - self.menubar.add_cascade(label="Session", menu=session_menu) + self.menubar.add_cascade(label="Session", menu=session_menu, underline=0) def create_help_menu(self): """ From 1ebe33cabbb323bf16f5ca5fdfc92f4a7cffdfa9 Mon Sep 17 00:00:00 2001 From: Huy Pham <42948410+hpham@users.noreply.github.com> Date: Fri, 20 Sep 2019 13:51:01 -0700 Subject: [PATCH 4/4] get rid all the dash lines in menubar --- coretk/coretk/app.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index f1593662..01d79d17 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -190,7 +190,7 @@ class Application(tk.Frame): :return: nothing """ - view_menu = tk.Menu(self.menubar, tearoff=True) + view_menu = tk.Menu(self.menubar) self.create_show_menu(view_menu) view_menu.add_command( label="Show hidden nodes", command=action.view_show_hidden_nodes @@ -216,7 +216,7 @@ class Application(tk.Frame): :param tkinter.Menu tools_menu: tools menu :return: nothing """ - experimental_menu = tk.Menu(tools_menu, tearoff=True) + experimental_menu = tk.Menu(tools_menu) experimental_menu.add_command( label="Plugins...", command=action.sub_menu_items, underline=0 ) @@ -403,7 +403,7 @@ class Application(tk.Frame): :return: nothing """ - topology_generator_menu = tk.Menu(tools_menu, tearoff=True) + topology_generator_menu = tk.Menu(tools_menu) self.create_random_menu(topology_generator_menu) self.create_grid_menu(topology_generator_menu) @@ -474,7 +474,7 @@ class Application(tk.Frame): :param tkinter.Menu widget_menu: widget_menu :return: nothing """ - observer_widget_menu = tk.Menu(widget_menu, tearoff=True) + observer_widget_menu = tk.Menu(widget_menu) observer_widget_menu.add_command(label="None", command=action.sub_menu_items) observer_widget_menu.add_command( label="processes", command=action.sub_menu_items @@ -529,7 +529,7 @@ class Application(tk.Frame): :param tkinter.Menu widget_menu: widget menu :return: nothing """ - adjacency_menu = tk.Menu(widget_menu, tearoff=True) + adjacency_menu = tk.Menu(widget_menu) adjacency_menu.add_command(label="OSPFv2", command=action.sub_menu_items) adjacency_menu.add_command(label="OSPFv3", command=action.sub_menu_items) adjacency_menu.add_command(label="OSLR", command=action.sub_menu_items) @@ -543,7 +543,7 @@ class Application(tk.Frame): :return: nothing """ - widget_menu = tk.Menu(self.menubar, tearoff=True) + widget_menu = tk.Menu(self.menubar) self.create_observer_widgets_menu(widget_menu) self.create_adjacency_menu(widget_menu) widget_menu.add_command(label="Throughput", command=action.widgets_throughput) @@ -565,7 +565,7 @@ class Application(tk.Frame): :return: nothing """ - session_menu = tk.Menu(self.menubar, tearoff=True) + session_menu = tk.Menu(self.menubar) session_menu.add_command( label="Start", command=action.session_start, underline=0 )