def draw_reference_point(self): label_frame = ttk.Labelframe(self.top, text="Reference Point", padding=FRAME_PAD) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) label = ttk.Label( label_frame, text="Default is (0, 0), the upper left corner of the canvas") label.grid() frame = ttk.Frame(label_frame) frame.grid(sticky="ew", pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) label = ttk.Label(frame, text="X") label.grid(row=0, column=0, sticky="w", padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.x) entry.grid(row=0, column=1, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Y") label.grid(row=0, column=2, sticky="w", padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.y) entry.grid(row=0, column=3, sticky="ew", padx=PADX) label = ttk.Label(label_frame, text="Translates To") label.grid() frame = ttk.Frame(label_frame) frame.grid(sticky="ew", pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) frame.columnconfigure(5, weight=1) label = ttk.Label(frame, text="Lat") label.grid(row=0, column=0, sticky="w", padx=PADX) entry = validation.FloatEntry(frame, textvariable=self.lat) entry.grid(row=0, column=1, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Lon") label.grid(row=0, column=2, sticky="w", padx=PADX) entry = validation.FloatEntry(frame, textvariable=self.lon) entry.grid(row=0, column=3, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Alt") label.grid(row=0, column=4, sticky="w", padx=PADX) entry = validation.FloatEntry(frame, textvariable=self.alt) entry.grid(row=0, column=5, sticky="ew")
def draw_size(self) -> None: label_frame = ttk.Labelframe(self.top, text="Size", padding=FRAME_PAD) label_frame.grid(sticky=tk.EW) label_frame.columnconfigure(0, weight=1) # draw size row 1 frame = ttk.Frame(label_frame) frame.grid(sticky=tk.EW, pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) label = ttk.Label(frame, text="Width") label.grid(row=0, column=0, sticky=tk.W, padx=PADX) entry = validation.PositiveIntEntry(frame, textvariable=self.pixel_width) entry.grid(row=0, column=1, sticky=tk.EW, padx=PADX) entry.bind("<KeyRelease>", self.size_scale_keyup) label = ttk.Label(frame, text="x Height") label.grid(row=0, column=2, sticky=tk.W, padx=PADX) entry = validation.PositiveIntEntry(frame, textvariable=self.pixel_height) entry.grid(row=0, column=3, sticky=tk.EW, padx=PADX) entry.bind("<KeyRelease>", self.size_scale_keyup) label = ttk.Label(frame, text="Pixels") label.grid(row=0, column=4, sticky=tk.W) # draw size row 2 frame = ttk.Frame(label_frame) frame.grid(sticky=tk.EW, pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) label = ttk.Label(frame, text="Width") label.grid(row=0, column=0, sticky=tk.W, padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.meters_width, state=tk.DISABLED) entry.grid(row=0, column=1, sticky=tk.EW, padx=PADX) label = ttk.Label(frame, text="x Height") label.grid(row=0, column=2, sticky=tk.W, padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.meters_height, state=tk.DISABLED) entry.grid(row=0, column=3, sticky=tk.EW, padx=PADX) label = ttk.Label(frame, text="Meters") label.grid(row=0, column=4, sticky=tk.W)
def draw_size(self): label_frame = ttk.Labelframe(self.top, text="Size", padding=FRAME_PAD) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) # draw size row 1 frame = ttk.Frame(label_frame) frame.grid(sticky="ew", pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) label = ttk.Label(frame, text="Width") label.grid(row=0, column=0, sticky="w", padx=PADX) entry = validation.PositiveIntEntry(frame, textvariable=self.pixel_width) entry.grid(row=0, column=1, sticky="ew", padx=PADX) label = ttk.Label(frame, text="x Height") label.grid(row=0, column=2, sticky="w", padx=PADX) entry = validation.PositiveIntEntry(frame, textvariable=self.pixel_height) entry.grid(row=0, column=3, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Pixels") label.grid(row=0, column=4, sticky="w") # draw size row 2 frame = ttk.Frame(label_frame) frame.grid(sticky="ew", pady=PADY) frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) label = ttk.Label(frame, text="Width") label.grid(row=0, column=0, sticky="w", padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.meters_width) entry.grid(row=0, column=1, sticky="ew", padx=PADX) label = ttk.Label(frame, text="x Height") label.grid(row=0, column=2, sticky="w", padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.meters_height) entry.grid(row=0, column=3, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Meters") label.grid(row=0, column=4, sticky="w")
def draw_scale(self): label_frame = ttk.Labelframe(self.top, text="Scale", padding=FRAME_PAD) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) frame = ttk.Frame(label_frame) frame.grid(sticky="ew") frame.columnconfigure(1, weight=1) label = ttk.Label(frame, text=f"{PIXEL_SCALE} Pixels =") label.grid(row=0, column=0, sticky="w", padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.scale) entry.grid(row=0, column=1, sticky="ew", padx=PADX) label = ttk.Label(frame, text="Meters") label.grid(row=0, column=2, sticky="w")
def draw_scale(self) -> None: label_frame = ttk.Labelframe(self.top, text="Scale", padding=FRAME_PAD) label_frame.grid(sticky=tk.EW) label_frame.columnconfigure(0, weight=1) frame = ttk.Frame(label_frame) frame.grid(sticky=tk.EW) frame.columnconfigure(1, weight=1) label = ttk.Label(frame, text=f"{PIXEL_SCALE} Pixels =") label.grid(row=0, column=0, sticky=tk.W, padx=PADX) entry = validation.PositiveFloatEntry(frame, textvariable=self.scale) entry.grid(row=0, column=1, sticky=tk.EW, padx=PADX) entry.bind("<KeyRelease>", self.size_scale_keyup) label = ttk.Label(frame, text="Meters") label.grid(row=0, column=2, sticky=tk.W)
def get_frame(self) -> ttk.Frame: frame = ttk.Frame(self.top) frame.columnconfigure(1, weight=1) if self.is_symmetric: label_name = "Symmetric Link Effects" else: label_name = "Asymmetric Effects: Downstream / Upstream " row = 0 label = ttk.Label(frame, text=label_name, anchor=tk.CENTER) label.grid(row=row, column=0, columnspan=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Bandwidth (bps)") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.bandwidth) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) if not self.is_symmetric: entry = validation.PositiveIntEntry( frame, empty_enabled=False, textvariable=self.down_bandwidth) entry.grid(row=row, column=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Delay (us)") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.delay) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) if not self.is_symmetric: entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.down_delay) entry.grid(row=row, column=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Jitter (us)") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.jitter) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) if not self.is_symmetric: entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.down_jitter) entry.grid(row=row, column=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Loss (%)") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveFloatEntry(frame, empty_enabled=False, textvariable=self.loss) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) if not self.is_symmetric: entry = validation.PositiveFloatEntry(frame, empty_enabled=False, textvariable=self.down_loss) entry.grid(row=row, column=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Duplicate (%)") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveIntEntry(frame, empty_enabled=False, textvariable=self.duplicate) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) if not self.is_symmetric: entry = validation.PositiveIntEntry( frame, empty_enabled=False, textvariable=self.down_duplicate) entry.grid(row=row, column=2, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Color") label.grid(row=row, column=0, sticky=tk.EW) self.color_button = tk.Button( frame, textvariable=self.color, background=self.color.get(), bd=0, relief=tk.FLAT, highlightthickness=0, command=self.click_color, ) self.color_button.grid(row=row, column=1, sticky=tk.EW, pady=PADY) row = row + 1 label = ttk.Label(frame, text="Width") label.grid(row=row, column=0, sticky=tk.EW) entry = validation.PositiveFloatEntry(frame, empty_enabled=False, textvariable=self.width) entry.grid(row=row, column=1, sticky=tk.EW, pady=PADY) return frame
def draw_config(self) -> None: group_mapping = {} for key in self.config: option = self.config[key] group = group_mapping.setdefault(option.group, []) group.append(option) for group_name in sorted(group_mapping): group = group_mapping[group_name] tab = FrameScroll(self, self.app, borderwidth=0, padding=FRAME_PAD) tab.frame.columnconfigure(1, weight=1) self.add(tab, text=group_name) for index, option in enumerate(sorted(group, key=lambda x: x.name)): label = ttk.Label(tab.frame, text=option.label) label.grid(row=index, pady=PADY, padx=PADX, sticky=tk.W) value = tk.StringVar() if option.type == ConfigOptionType.BOOL: select = ("On", "Off") state = "readonly" if self.enabled else tk.DISABLED combobox = ttk.Combobox(tab.frame, textvariable=value, values=select, state=state) combobox.grid(row=index, column=1, sticky=tk.EW) if option.value == "1": value.set("On") else: value.set("Off") elif option.select: value.set(option.value) select = tuple(option.select) state = "readonly" if self.enabled else tk.DISABLED combobox = ttk.Combobox(tab.frame, textvariable=value, values=select, state=state) combobox.grid(row=index, column=1, sticky=tk.EW) elif option.type == ConfigOptionType.STRING: value.set(option.value) state = tk.NORMAL if self.enabled else tk.DISABLED if "file" in option.label: file_frame = ttk.Frame(tab.frame) file_frame.grid(row=index, column=1, sticky=tk.EW) file_frame.columnconfigure(0, weight=1) entry = ttk.Entry(file_frame, textvariable=value, state=state) entry.grid(row=0, column=0, sticky=tk.EW, padx=PADX) func = partial(file_button_click, value, self) button = ttk.Button(file_frame, text="...", command=func, state=state) button.grid(row=0, column=1) else: entry = ttk.Entry(tab.frame, textvariable=value, state=state) entry.grid(row=index, column=1, sticky=tk.EW) elif option.type in INT_TYPES: value.set(option.value) state = tk.NORMAL if self.enabled else tk.DISABLED entry = validation.PositiveIntEntry(tab.frame, textvariable=value, state=state) entry.grid(row=index, column=1, sticky=tk.EW) elif option.type == ConfigOptionType.FLOAT: value.set(option.value) state = tk.NORMAL if self.enabled else tk.DISABLED entry = validation.PositiveFloatEntry(tab.frame, textvariable=value, state=state) entry.grid(row=index, column=1, sticky=tk.EW) else: logging.error("unhandled config option type: %s", option.type) self.values[option.name] = value