type hint some files
This commit is contained in:
parent
0e74212c43
commit
a8a0255624
13 changed files with 643 additions and 62 deletions
|
@ -1,7 +1,9 @@
|
|||
from tkinter import messagebox
|
||||
|
||||
import grpc
|
||||
|
||||
def show_grpc_error(e):
|
||||
|
||||
def show_grpc_error(e: grpc.RpcError):
|
||||
title = [x.capitalize() for x in e.code().name.lower().split("_")]
|
||||
title = " ".join(title)
|
||||
title = f"GRPC {title}"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import logging
|
||||
import tkinter as tk
|
||||
from tkinter.font import Font
|
||||
from typing import Tuple
|
||||
|
||||
from core.gui import themes
|
||||
from core.gui.dialogs.linkconfig import LinkConfigurationDialog
|
||||
|
@ -13,7 +14,7 @@ EDGE_COLOR = "#ff0000"
|
|||
|
||||
|
||||
class CanvasWirelessEdge:
|
||||
def __init__(self, token, position, src, dst, canvas):
|
||||
def __init__(self, token: Tuple[int, int], position, src: int, dst: int, canvas):
|
||||
self.token = token
|
||||
self.src = src
|
||||
self.dst = dst
|
||||
|
@ -31,7 +32,7 @@ class CanvasEdge:
|
|||
Canvas edge class
|
||||
"""
|
||||
|
||||
def __init__(self, x1, y1, x2, y2, src, canvas):
|
||||
def __init__(self, x1: int, y1: int, x2: int, y2: int, src: int, canvas):
|
||||
"""
|
||||
Create an instance of canvas edge object
|
||||
:param int x1: source x-coord
|
||||
|
|
|
@ -9,7 +9,7 @@ class Images:
|
|||
images = {}
|
||||
|
||||
@classmethod
|
||||
def create(cls, file_path, width, height=None):
|
||||
def create(cls, file_path: str, width: int, height: int = None):
|
||||
if height is None:
|
||||
height = width
|
||||
image = Image.open(file_path)
|
||||
|
@ -22,12 +22,12 @@ class Images:
|
|||
cls.images[image.stem] = str(image)
|
||||
|
||||
@classmethod
|
||||
def get(cls, image_enum, width, height=None):
|
||||
def get(cls, image_enum, width: int, height: int = None):
|
||||
file_path = cls.images[image_enum.value]
|
||||
return cls.create(file_path, width, height)
|
||||
|
||||
@classmethod
|
||||
def get_custom(cls, name, width, height=None):
|
||||
def get_custom(cls, name: str, width: int, height: int = None):
|
||||
file_path = cls.images[name]
|
||||
return cls.create(file_path, width, height)
|
||||
|
||||
|
|
|
@ -3,8 +3,10 @@ The actions taken when each menubar option is clicked
|
|||
"""
|
||||
|
||||
import logging
|
||||
import tkinter as tk
|
||||
import webbrowser
|
||||
from tkinter import filedialog, messagebox
|
||||
from typing import Optional
|
||||
|
||||
from core.gui.appconfig import XMLS_PATH
|
||||
from core.gui.dialogs.about import AboutDialog
|
||||
|
@ -30,14 +32,14 @@ class MenuAction:
|
|||
self.app = app
|
||||
self.canvas = app.canvas
|
||||
|
||||
def cleanup_old_session(self, quitapp=False):
|
||||
def cleanup_old_session(self, quitapp: bool = False):
|
||||
logging.info("cleaning up old session")
|
||||
self.app.core.stop_session()
|
||||
self.app.core.delete_session()
|
||||
# if quitapp:
|
||||
# self.app.quit()
|
||||
|
||||
def prompt_save_running_session(self, quitapp=False):
|
||||
def prompt_save_running_session(self, quitapp: bool = False):
|
||||
"""
|
||||
Prompt use to stop running session before application is closed
|
||||
|
||||
|
@ -56,7 +58,7 @@ class MenuAction:
|
|||
elif quitapp:
|
||||
self.app.quit()
|
||||
|
||||
def on_quit(self, event=None):
|
||||
def on_quit(self, event: Optional[tk.Event] = None):
|
||||
"""
|
||||
Prompt user whether so save running session, and then close the application
|
||||
|
||||
|
@ -64,7 +66,7 @@ class MenuAction:
|
|||
"""
|
||||
self.prompt_save_running_session(quitapp=True)
|
||||
|
||||
def file_save_as_xml(self, event=None):
|
||||
def file_save_as_xml(self, event: Optional[tk.Event] = None):
|
||||
logging.info("menuaction.py file_save_as_xml()")
|
||||
file_path = filedialog.asksaveasfilename(
|
||||
initialdir=str(XMLS_PATH),
|
||||
|
@ -75,7 +77,7 @@ class MenuAction:
|
|||
if file_path:
|
||||
self.app.core.save_xml(file_path)
|
||||
|
||||
def file_open_xml(self, event=None):
|
||||
def file_open_xml(self, event: Optional[tk.Event] = None):
|
||||
logging.info("menuaction.py file_open_xml()")
|
||||
file_path = filedialog.askopenfilename(
|
||||
initialdir=str(XMLS_PATH),
|
||||
|
@ -141,11 +143,11 @@ class MenuAction:
|
|||
else:
|
||||
self.app.core.cancel_throughputs()
|
||||
|
||||
def copy(self, event=None):
|
||||
def copy(self, event: Optional[tk.Event] = None):
|
||||
logging.debug("copy")
|
||||
self.app.canvas.copy()
|
||||
|
||||
def paste(self, event=None):
|
||||
def paste(self, event: Optional[tk.Event] = None):
|
||||
logging.debug("paste")
|
||||
self.app.canvas.paste()
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ class Menubar(tk.Menu):
|
|||
view_menu.add_command(label="Zoom out", accelerator="-", state=tk.DISABLED)
|
||||
self.add_cascade(label="View", menu=view_menu)
|
||||
|
||||
def create_show_menu(self, view_menu):
|
||||
def create_show_menu(self, view_menu: tk.Menu):
|
||||
"""
|
||||
Create the menu items in View/Show
|
||||
|
||||
|
@ -169,7 +169,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label="API Messages", state=tk.DISABLED)
|
||||
view_menu.add_cascade(label="Show", menu=menu)
|
||||
|
||||
def create_experimental_menu(self, tools_menu):
|
||||
def create_experimental_menu(self, tools_menu: tk.Menu):
|
||||
"""
|
||||
Create experimental menu item and the sub menu items inside
|
||||
|
||||
|
@ -182,7 +182,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label="Topology partitioning...", state=tk.DISABLED)
|
||||
tools_menu.add_cascade(label="Experimental", menu=menu)
|
||||
|
||||
def create_random_menu(self, topology_generator_menu):
|
||||
def create_random_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create random menu item and the sub menu items inside
|
||||
|
||||
|
@ -197,7 +197,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Random", menu=menu)
|
||||
|
||||
def create_grid_menu(self, topology_generator_menu):
|
||||
def create_grid_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create grid menu item and the sub menu items inside
|
||||
|
||||
|
@ -212,7 +212,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Grid", menu=menu)
|
||||
|
||||
def create_connected_grid_menu(self, topology_generator_menu):
|
||||
def create_connected_grid_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create connected grid menu items and the sub menu items inside
|
||||
|
||||
|
@ -229,7 +229,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_cascade(label=label, menu=submenu)
|
||||
topology_generator_menu.add_cascade(label="Connected Grid", menu=menu)
|
||||
|
||||
def create_chain_menu(self, topology_generator_menu):
|
||||
def create_chain_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create chain menu item and the sub menu items inside
|
||||
|
||||
|
@ -244,7 +244,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Chain", menu=menu)
|
||||
|
||||
def create_star_menu(self, topology_generator_menu):
|
||||
def create_star_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create star menu item and the sub menu items inside
|
||||
|
||||
|
@ -257,7 +257,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Star", menu=menu)
|
||||
|
||||
def create_cycle_menu(self, topology_generator_menu):
|
||||
def create_cycle_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create cycle menu item and the sub items inside
|
||||
|
||||
|
@ -270,7 +270,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Cycle", menu=menu)
|
||||
|
||||
def create_wheel_menu(self, topology_generator_menu):
|
||||
def create_wheel_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create wheel menu item and the sub menu items inside
|
||||
|
||||
|
@ -283,7 +283,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Wheel", menu=menu)
|
||||
|
||||
def create_cube_menu(self, topology_generator_menu):
|
||||
def create_cube_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create cube menu item and the sub menu items inside
|
||||
|
||||
|
@ -296,7 +296,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Cube", menu=menu)
|
||||
|
||||
def create_clique_menu(self, topology_generator_menu):
|
||||
def create_clique_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create clique menu item and the sub menu items inside
|
||||
|
||||
|
@ -309,7 +309,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label=label, state=tk.DISABLED)
|
||||
topology_generator_menu.add_cascade(label="Clique", menu=menu)
|
||||
|
||||
def create_bipartite_menu(self, topology_generator_menu):
|
||||
def create_bipartite_menu(self, topology_generator_menu: tk.Menu):
|
||||
"""
|
||||
Create bipartite menu item and the sub menu items inside
|
||||
|
||||
|
@ -328,7 +328,7 @@ class Menubar(tk.Menu):
|
|||
temp = temp - 1
|
||||
topology_generator_menu.add_cascade(label="Bipartite", menu=menu)
|
||||
|
||||
def create_topology_generator_menu(self, tools_menu):
|
||||
def create_topology_generator_menu(self, tools_menu: tk.Menu):
|
||||
"""
|
||||
Create topology menu item and its sub menu items
|
||||
|
||||
|
@ -371,7 +371,7 @@ class Menubar(tk.Menu):
|
|||
menu.add_command(label="Debugger...", state=tk.DISABLED)
|
||||
self.add_cascade(label="Tools", menu=menu)
|
||||
|
||||
def create_observer_widgets_menu(self, widget_menu):
|
||||
def create_observer_widgets_menu(self, widget_menu: tk.Menu):
|
||||
"""
|
||||
Create observer widget menu item and create the sub menu items inside
|
||||
|
||||
|
@ -409,7 +409,7 @@ class Menubar(tk.Menu):
|
|||
)
|
||||
widget_menu.add_cascade(label="Observer Widgets", menu=menu)
|
||||
|
||||
def create_adjacency_menu(self, widget_menu):
|
||||
def create_adjacency_menu(self, widget_menu: tk.Menu):
|
||||
"""
|
||||
Create adjacency menu item and the sub menu items inside
|
||||
|
||||
|
|
|
@ -68,9 +68,5 @@ class StatusBar(ttk.Frame):
|
|||
dialog = AlertsDialog(self.app, self.app)
|
||||
dialog.show()
|
||||
|
||||
def set_status(self, message):
|
||||
def set_status(self, message: str):
|
||||
self.statusvar.set(message)
|
||||
|
||||
def stop_session_callback(self, cleanup_time):
|
||||
self.progress_bar.stop()
|
||||
self.statusvar.set(f"Stopped in {cleanup_time:.3f} seconds")
|
||||
|
|
|
@ -33,7 +33,7 @@ class Colors:
|
|||
listboxbg = "#f2f1f0"
|
||||
|
||||
|
||||
def load(style):
|
||||
def load(style: ttk.Style):
|
||||
style.theme_create(
|
||||
THEME_DARK,
|
||||
"clam",
|
||||
|
@ -141,13 +141,13 @@ def load(style):
|
|||
)
|
||||
|
||||
|
||||
def theme_change_menu(event):
|
||||
def theme_change_menu(event: tk.Event):
|
||||
if not isinstance(event.widget, tk.Menu):
|
||||
return
|
||||
style_menu(event.widget)
|
||||
|
||||
|
||||
def style_menu(widget):
|
||||
def style_menu(widget: ttk.Widget):
|
||||
style = ttk.Style()
|
||||
bg = style.lookup(".", "background")
|
||||
fg = style.lookup(".", "foreground")
|
||||
|
@ -159,7 +159,7 @@ def style_menu(widget):
|
|||
)
|
||||
|
||||
|
||||
def style_listbox(widget):
|
||||
def style_listbox(widget: ttk.Widget):
|
||||
style = ttk.Style()
|
||||
bg = style.lookup(".", "background")
|
||||
fg = style.lookup(".", "foreground")
|
||||
|
@ -176,7 +176,7 @@ def style_listbox(widget):
|
|||
)
|
||||
|
||||
|
||||
def theme_change(event):
|
||||
def theme_change(event: tk.Event):
|
||||
style = ttk.Style()
|
||||
style.configure(Styles.picker_button, font=("TkDefaultFont", 8, "normal"))
|
||||
style.configure(
|
||||
|
|
|
@ -5,6 +5,7 @@ from functools import partial
|
|||
from tkinter import messagebox, ttk
|
||||
from tkinter.font import Font
|
||||
|
||||
from core.api.grpc import core_pb2
|
||||
from core.gui.dialogs.customnodes import CustomNodesDialog
|
||||
from core.gui.dialogs.marker import MarkerDialog
|
||||
from core.gui.graph.enums import GraphMode
|
||||
|
@ -100,7 +101,7 @@ class Toolbar(ttk.Frame):
|
|||
self.create_network_button()
|
||||
self.create_annotation_button()
|
||||
|
||||
def design_select(self, button):
|
||||
def design_select(self, button: ttk.Button):
|
||||
logging.info("selecting design button: %s", button)
|
||||
self.select_button.state(["!pressed"])
|
||||
self.link_button.state(["!pressed"])
|
||||
|
@ -109,7 +110,7 @@ class Toolbar(ttk.Frame):
|
|||
self.annotation_button.state(["!pressed"])
|
||||
button.state(["pressed"])
|
||||
|
||||
def runtime_select(self, button):
|
||||
def runtime_select(self, button: ttk.Button):
|
||||
logging.info("selecting runtime button: %s", button)
|
||||
self.runtime_select_button.state(["!pressed"])
|
||||
self.stop_button.state(["!pressed"])
|
||||
|
@ -185,7 +186,7 @@ class Toolbar(ttk.Frame):
|
|||
0, lambda: self.show_picker(self.node_button, self.node_picker)
|
||||
)
|
||||
|
||||
def show_picker(self, button, picker):
|
||||
def show_picker(self, button: ttk.Button, picker: ttk.Frame):
|
||||
x = self.winfo_width() + 1
|
||||
y = button.winfo_rooty() - picker.master.winfo_rooty() - 1
|
||||
picker.place(x=x, y=y)
|
||||
|
@ -195,7 +196,7 @@ class Toolbar(ttk.Frame):
|
|||
self.wait_window(picker)
|
||||
self.app.unbind_all("<ButtonRelease-1>")
|
||||
|
||||
def create_picker_button(self, image, func, frame, label):
|
||||
def create_picker_button(self, image, func, frame: ttk.Frame, label: str):
|
||||
"""
|
||||
Create button and put it on the frame
|
||||
|
||||
|
@ -212,7 +213,7 @@ class Toolbar(ttk.Frame):
|
|||
button.bind("<ButtonRelease-1>", lambda e: func())
|
||||
button.grid(pady=1)
|
||||
|
||||
def create_button(self, frame, image, func, tooltip):
|
||||
def create_button(self, frame: ttk.Frame, image, func, tooltip: str):
|
||||
button = ttk.Button(frame, image=image, command=func)
|
||||
button.image = image
|
||||
button.grid(sticky="ew")
|
||||
|
@ -243,7 +244,7 @@ class Toolbar(ttk.Frame):
|
|||
task = BackgroundTask(self, self.app.core.start_session, self.start_callback)
|
||||
task.start()
|
||||
|
||||
def start_callback(self, response):
|
||||
def start_callback(self, response: core_pb2.StartSessionResponse):
|
||||
self.app.statusbar.progress_bar.stop()
|
||||
total = time.perf_counter() - self.time
|
||||
message = f"Start ran for {total:.3f} seconds"
|
||||
|
@ -275,7 +276,7 @@ class Toolbar(ttk.Frame):
|
|||
dialog = CustomNodesDialog(self.app, self.app)
|
||||
dialog.show()
|
||||
|
||||
def update_button(self, button, image, node_draw):
|
||||
def update_button(self, button: ttk.Button, image, node_draw):
|
||||
logging.info("update button(%s): %s", button, node_draw)
|
||||
self.hide_pickers()
|
||||
button.configure(image=image)
|
||||
|
@ -426,7 +427,7 @@ class Toolbar(ttk.Frame):
|
|||
task = BackgroundTask(self, self.app.core.stop_session, self.stop_callback)
|
||||
task.start()
|
||||
|
||||
def stop_callback(self, response):
|
||||
def stop_callback(self, response: core_pb2.StopSessionResponse):
|
||||
self.app.statusbar.progress_bar.stop()
|
||||
self.set_design()
|
||||
total = time.perf_counter() - self.time
|
||||
|
@ -436,7 +437,7 @@ class Toolbar(ttk.Frame):
|
|||
if not response.result:
|
||||
messagebox.showerror("Stop Error", "Errors stopping session")
|
||||
|
||||
def update_annotation(self, image, shape_type):
|
||||
def update_annotation(self, image, shape_type: str):
|
||||
logging.info("clicked annotation: ")
|
||||
self.hide_pickers()
|
||||
self.annotation_button.configure(image=image)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
from typing import Optional
|
||||
|
||||
from core.gui.themes import Styles
|
||||
|
||||
|
@ -9,7 +10,7 @@ class Tooltip(object):
|
|||
Create tool tip for a given widget
|
||||
"""
|
||||
|
||||
def __init__(self, widget, text="widget info"):
|
||||
def __init__(self, widget: tk.Widget, text: str = "widget info"):
|
||||
self.widget = widget
|
||||
self.text = text
|
||||
self.widget.bind("<Enter>", self.on_enter)
|
||||
|
@ -18,10 +19,10 @@ class Tooltip(object):
|
|||
self.id = None
|
||||
self.tw = None
|
||||
|
||||
def on_enter(self, event=None):
|
||||
def on_enter(self, event: Optional[tk.Event] = None):
|
||||
self.schedule()
|
||||
|
||||
def on_leave(self, event=None):
|
||||
def on_leave(self, event: Optional[tk.Event] = None):
|
||||
self.unschedule()
|
||||
self.close(event)
|
||||
|
||||
|
@ -35,7 +36,7 @@ class Tooltip(object):
|
|||
if id_:
|
||||
self.widget.after_cancel(id_)
|
||||
|
||||
def enter(self, event=None):
|
||||
def enter(self, event: Optional[tk.Event] = None):
|
||||
x, y, cx, cy = self.widget.bbox("insert")
|
||||
x += self.widget.winfo_rootx()
|
||||
y += self.widget.winfo_rooty() + 32
|
||||
|
@ -50,6 +51,6 @@ class Tooltip(object):
|
|||
label = ttk.Label(frame, text=self.text, style=Styles.tooltip)
|
||||
label.grid()
|
||||
|
||||
def close(self, event=None):
|
||||
def close(self, event: Optional[tk.Event] = None):
|
||||
if self.tw:
|
||||
self.tw.destroy()
|
||||
|
|
|
@ -27,7 +27,7 @@ class InputValidation:
|
|||
self.rgb = self.master.register(self.check_rbg)
|
||||
self.hex = self.master.register(self.check_hex)
|
||||
|
||||
def ip_focus_out(self, event):
|
||||
def ip_focus_out(self, event: tk.Event):
|
||||
value = event.widget.get()
|
||||
try:
|
||||
IPNetwork(value)
|
||||
|
@ -35,12 +35,12 @@ class InputValidation:
|
|||
event.widget.delete(0, tk.END)
|
||||
event.widget.insert(tk.END, "invalid")
|
||||
|
||||
def focus_out(self, event, default):
|
||||
def focus_out(self, event: tk.Event, default: str):
|
||||
value = event.widget.get()
|
||||
if value == "":
|
||||
event.widget.insert(tk.END, default)
|
||||
|
||||
def check_positive_int(self, s):
|
||||
def check_positive_int(self, s: str):
|
||||
if len(s) == 0:
|
||||
return True
|
||||
try:
|
||||
|
@ -51,7 +51,7 @@ class InputValidation:
|
|||
except ValueError:
|
||||
return False
|
||||
|
||||
def check_positive_float(self, s):
|
||||
def check_positive_float(self, s: str):
|
||||
if len(s) == 0:
|
||||
return True
|
||||
try:
|
||||
|
@ -62,7 +62,7 @@ class InputValidation:
|
|||
except ValueError:
|
||||
return False
|
||||
|
||||
def check_node_name(self, s):
|
||||
def check_node_name(self, s: str):
|
||||
if len(s) < 0:
|
||||
return False
|
||||
if len(s) == 0:
|
||||
|
@ -72,7 +72,7 @@ class InputValidation:
|
|||
return False
|
||||
return True
|
||||
|
||||
def check_canvas_int(sefl, s):
|
||||
def check_canvas_int(self, s: str):
|
||||
if len(s) == 0:
|
||||
return True
|
||||
try:
|
||||
|
@ -83,7 +83,7 @@ class InputValidation:
|
|||
except ValueError:
|
||||
return False
|
||||
|
||||
def check_canvas_float(self, s):
|
||||
def check_canvas_float(self, s: str):
|
||||
if not s:
|
||||
return True
|
||||
try:
|
||||
|
@ -94,7 +94,7 @@ class InputValidation:
|
|||
except ValueError:
|
||||
return False
|
||||
|
||||
def check_ip4(self, s):
|
||||
def check_ip4(self, s: str):
|
||||
if not s:
|
||||
return True
|
||||
pat = re.compile("^([0-9]+[.])*[0-9]*$")
|
||||
|
@ -113,7 +113,7 @@ class InputValidation:
|
|||
else:
|
||||
return False
|
||||
|
||||
def check_rbg(self, s):
|
||||
def check_rbg(self, s: str):
|
||||
if not s:
|
||||
return True
|
||||
if s.startswith("0") and len(s) >= 2:
|
||||
|
@ -127,7 +127,7 @@ class InputValidation:
|
|||
except ValueError:
|
||||
return False
|
||||
|
||||
def check_hex(self, s):
|
||||
def check_hex(self, s: str):
|
||||
if not s:
|
||||
return True
|
||||
pat = re.compile("^([#]([0-9]|[a-f])+)$|^[#]$")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue