From ca798215e4ea66dcf1fdc0adc8072d18a4f351a3 Mon Sep 17 00:00:00 2001 From: Blake Harnden <32446120+bharnden@users.noreply.github.com> Date: Wed, 13 Nov 2019 10:45:43 -0800 Subject: [PATCH] updates to leverage theming, initially using a dark theme, updated all dialogs to be contained within a frame to help provide consistent theming --- coretk/coretk/app.py | 15 +- coretk/coretk/canvastooltip.py | 18 +- coretk/coretk/dialogs/canvasbackground.py | 16 +- coretk/coretk/dialogs/canvassizeandscale.py | 14 +- coretk/coretk/dialogs/customnodes.py | 20 +-- coretk/coretk/dialogs/dialog.py | 7 +- coretk/coretk/dialogs/emaneconfig.py | 38 ++-- coretk/coretk/dialogs/hooks.py | 20 ++- coretk/coretk/dialogs/icondialog.py | 8 +- coretk/coretk/dialogs/mobilityconfig.py | 24 ++- coretk/coretk/dialogs/nodeconfig.py | 8 +- coretk/coretk/dialogs/nodeservice.py | 8 +- coretk/coretk/dialogs/observers.py | 12 +- coretk/coretk/dialogs/preferences.py | 6 +- coretk/coretk/dialogs/servers.py | 14 +- coretk/coretk/dialogs/serviceconfiguration.py | 8 +- coretk/coretk/dialogs/sessionoptions.py | 8 +- coretk/coretk/dialogs/sessions.py | 14 +- coretk/coretk/dialogs/wlanconfig.py | 23 ++- coretk/coretk/theme.py | 162 ------------------ coretk/coretk/themes.py | 127 ++++++++++++++ coretk/coretk/tooltip.py | 17 +- coretk/coretk/widgets.py | 20 +-- 23 files changed, 298 insertions(+), 309 deletions(-) delete mode 100644 coretk/coretk/theme.py create mode 100644 coretk/coretk/themes.py diff --git a/coretk/coretk/app.py b/coretk/coretk/app.py index 452d5397..bc3ac9dd 100644 --- a/coretk/coretk/app.py +++ b/coretk/coretk/app.py @@ -1,8 +1,9 @@ import logging import tkinter as tk +from functools import partial from tkinter import ttk -from coretk import appconfig +from coretk import appconfig, themes from coretk.coreclient import CoreClient from coretk.graph import CanvasGraph from coretk.images import ImageEnum, Images @@ -14,7 +15,8 @@ from coretk.toolbar import Toolbar class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) - Images.load_all() + self.style = ttk.Style() + self.setup_theme() self.menubar = None self.toolbar = None self.canvas = None @@ -33,6 +35,14 @@ class Application(tk.Frame): self.draw() self.core.set_up() + def setup_theme(self): + themes.load(self.style) + self.style.theme_use(themes.DARK) + func = partial(themes.update_menu, self.style) + self.master.bind_class("Menu", "<>", func) + func = partial(themes.update_toplevel, self.style) + self.master.bind_class("Toplevel", "<>", func) + def setup_app(self): self.master.title("CORE") self.master.geometry("1000x800") @@ -78,6 +88,7 @@ class Application(tk.Frame): if __name__ == "__main__": log_format = "%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s" logging.basicConfig(level=logging.DEBUG, format=log_format) + Images.load_all() appconfig.check_directory() app = Application() app.mainloop() diff --git a/coretk/coretk/canvastooltip.py b/coretk/coretk/canvastooltip.py index 8ace41d0..8ae528d8 100644 --- a/coretk/coretk/canvastooltip.py +++ b/coretk/coretk/canvastooltip.py @@ -1,6 +1,8 @@ import tkinter as tk from tkinter import ttk +from coretk.themes import Styles + class CanvasTooltip: """ @@ -17,16 +19,13 @@ class CanvasTooltip: Alberto Vassena on 2016.12.10. """ - def __init__( - self, canvas, *, bg="#FFFFEA", pad=(5, 3, 5, 3), waittime=400, wraplength=600 - ): + def __init__(self, canvas, *, pad=(5, 3, 5, 3), waittime=400, wraplength=600): # in miliseconds, originally 500 self.waittime = waittime # in pixels, originally 180 self.wraplength = wraplength self.canvas = canvas self.text = tk.StringVar() - self.bg = bg self.pad = pad self.id = None self.tw = None @@ -78,7 +77,6 @@ class CanvasTooltip: y1 = 0 return x1, y1 - bg = self.bg pad = self.pad canvas = self.canvas @@ -87,20 +85,16 @@ class CanvasTooltip: # Leaves only the label and removes the app window self.tw.wm_overrideredirect(True) - - win = tk.Frame(self.tw, background=bg, borderwidth=0) + win = ttk.Frame(self.tw, style=Styles.tooltip_frame, padding=3) win.grid() label = ttk.Label( win, textvariable=self.text, - justify=tk.LEFT, - background=bg, - relief=tk.SOLID, - borderwidth=0, wraplength=self.wraplength, + style=Styles.tooltip, ) label.grid(padx=(pad[0], pad[2]), pady=(pad[1], pad[3]), sticky=tk.NSEW) - x, y = tip_pos_calculator(canvas, label) + x, y = tip_pos_calculator(canvas, label, pad=pad) self.tw.wm_geometry("+%d+%d" % (x, y)) def hide(self): diff --git a/coretk/coretk/dialogs/canvasbackground.py b/coretk/coretk/dialogs/canvasbackground.py index 8b1c4cf4..7b1dd186 100644 --- a/coretk/coretk/dialogs/canvasbackground.py +++ b/coretk/coretk/dialogs/canvasbackground.py @@ -40,7 +40,7 @@ class CanvasBackgroundDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_image() self.draw_image_label() self.draw_image_selection() @@ -50,16 +50,16 @@ class CanvasBackgroundDialog(Dialog): def draw_image(self): self.image_label = ttk.Label( - self, text="(image preview)", width=32, anchor=tk.CENTER + self.top, text="(image preview)", width=32, anchor=tk.CENTER ) self.image_label.grid(row=0, column=0, pady=5) def draw_image_label(self): - label = ttk.Label(self, text="Image filename: ") + label = ttk.Label(self.top, text="Image filename: ") label.grid(row=1, column=0, sticky="ew") def draw_image_selection(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.columnconfigure(0, weight=2) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) @@ -76,7 +76,7 @@ class CanvasBackgroundDialog(Dialog): button.grid(row=0, column=2, sticky="ew") def draw_options(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) @@ -105,12 +105,12 @@ class CanvasBackgroundDialog(Dialog): def draw_additional_options(self): checkbutton = ttk.Checkbutton( - self, text="Show grid", variable=self.show_grid_var + self.top, text="Show grid", variable=self.show_grid_var ) checkbutton.grid(row=4, column=0, sticky="ew", padx=PADX) checkbutton = ttk.Checkbutton( - self, + self.top, text="Adjust canvas size to image dimensions", variable=self.adjust_to_dim_var, command=self.click_adjust_canvas, @@ -121,7 +121,7 @@ class CanvasBackgroundDialog(Dialog): self.adjust_to_dim_var.set(0) def draw_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=6, column=0, pady=5, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) diff --git a/coretk/coretk/dialogs/canvassizeandscale.py b/coretk/coretk/dialogs/canvassizeandscale.py index 1af71c93..09132aef 100644 --- a/coretk/coretk/dialogs/canvassizeandscale.py +++ b/coretk/coretk/dialogs/canvassizeandscale.py @@ -44,7 +44,7 @@ class SizeAndScaleDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_size() self.draw_scale() self.draw_reference_point() @@ -52,7 +52,7 @@ class SizeAndScaleDialog(Dialog): self.draw_buttons() def draw_size(self): - label_frame = ttk.Labelframe(self, text="Size", padding=FRAME_BAD) + label_frame = ttk.Labelframe(self.top, text="Size", padding=FRAME_BAD) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) @@ -89,7 +89,7 @@ class SizeAndScaleDialog(Dialog): label.grid(row=0, column=4, sticky="w") def draw_scale(self): - label_frame = ttk.Labelframe(self, text="Scale", padding=FRAME_BAD) + label_frame = ttk.Labelframe(self.top, text="Scale", padding=FRAME_BAD) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) @@ -104,7 +104,9 @@ class SizeAndScaleDialog(Dialog): label.grid(row=0, column=2, sticky="w") def draw_reference_point(self): - label_frame = ttk.Labelframe(self, text="Reference Point", padding=FRAME_BAD) + label_frame = ttk.Labelframe( + self.top, text="Reference Point", padding=FRAME_BAD + ) label_frame.grid(sticky="ew") label_frame.columnconfigure(0, weight=1) @@ -156,12 +158,12 @@ class SizeAndScaleDialog(Dialog): def draw_save_as_default(self): button = ttk.Checkbutton( - self, text="Save as default?", variable=self.save_default + self.top, text="Save as default?", variable=self.save_default ) button.grid(sticky="w", pady=3) def draw_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.grid(sticky="ew") diff --git a/coretk/coretk/dialogs/customnodes.py b/coretk/coretk/dialogs/customnodes.py index f5c1ab78..154b7868 100644 --- a/coretk/coretk/dialogs/customnodes.py +++ b/coretk/coretk/dialogs/customnodes.py @@ -19,10 +19,10 @@ class ServicesSelectDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(stick="nsew") frame.rowconfigure(0, weight=1) for i in range(3): @@ -44,7 +44,7 @@ class ServicesSelectDialog(Dialog): for service in sorted(self.current_services): self.current.listbox.insert(tk.END, service) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(stick="ew") for i in range(2): frame.columnconfigure(i, weight=1) @@ -96,19 +96,19 @@ class CustomNodesDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) self.draw_node_config() self.draw_node_buttons() self.draw_buttons() def draw_node_config(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="nsew") frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) - self.nodes_list = ListboxScroll(frame) + self.nodes_list = ListboxScroll(frame, text="Nodes") self.nodes_list.grid(row=0, column=0, sticky="nsew") self.nodes_list.listbox.bind("<>", self.handle_node_select) for name in sorted(self.app.core.custom_nodes): @@ -125,7 +125,7 @@ class CustomNodesDialog(Dialog): button.grid(sticky="ew") def draw_node_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") for i in range(3): frame.columnconfigure(i, weight=1) @@ -144,7 +144,7 @@ class CustomNodesDialog(Dialog): self.delete_button.grid(row=0, column=2, sticky="ew") def draw_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/dialog.py b/coretk/coretk/dialogs/dialog.py index c043a47a..769fd176 100644 --- a/coretk/coretk/dialogs/dialog.py +++ b/coretk/coretk/dialogs/dialog.py @@ -1,4 +1,5 @@ import tkinter as tk +from tkinter import ttk from coretk.images import ImageEnum, Images @@ -7,7 +8,7 @@ DIALOG_PAD = 5 class Dialog(tk.Toplevel): def __init__(self, master, app, title, modal=False): - super().__init__(master, padx=DIALOG_PAD, pady=DIALOG_PAD) + super().__init__(master) self.withdraw() self.app = app self.modal = modal @@ -15,6 +16,10 @@ class Dialog(tk.Toplevel): self.protocol("WM_DELETE_WINDOW", self.destroy) image = Images.get(ImageEnum.CORE, 16) self.tk.call("wm", "iconphoto", self._w, image) + self.columnconfigure(0, weight=1) + self.rowconfigure(0, weight=1) + self.top = ttk.Frame(self, padding=DIALOG_PAD) + self.top.grid(sticky="nsew") def show(self): self.transient(self.master) diff --git a/coretk/coretk/dialogs/emaneconfig.py b/coretk/coretk/dialogs/emaneconfig.py index 8673d3fc..181e1264 100644 --- a/coretk/coretk/dialogs/emaneconfig.py +++ b/coretk/coretk/dialogs/emaneconfig.py @@ -55,10 +55,10 @@ class EmaneConfiguration(Dialog): return var def choose_core(self): - print("not implemented") + logging.info("not implemented") def node_name_and_image(self): - f = ttk.Frame(self) + f = ttk.Frame(self.top) lbl = ttk.Label(f, text="Node name:") lbl.grid(row=0, column=0, padx=2, pady=2) @@ -90,13 +90,15 @@ class EmaneConfiguration(Dialog): logging.info("emane config: %s", response) self.options = response.config - self.emane_dialog.columnconfigure(0, weight=1) - self.emane_dialog.rowconfigure(0, weight=1) - self.emane_config_frame = ConfigFrame(self.emane_dialog, config=self.options) + self.emane_dialog.top.columnconfigure(0, weight=1) + self.emane_dialog.top.rowconfigure(0, weight=1) + self.emane_config_frame = ConfigFrame( + self.emane_dialog.top, config=self.options + ) self.emane_config_frame.draw_config() self.emane_config_frame.grid(sticky="nsew") - frame = ttk.Frame(self.emane_dialog) + frame = ttk.Frame(self.emane_dialog.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) @@ -152,8 +154,8 @@ class EmaneConfiguration(Dialog): self.emane_model_dialog = Dialog( self, self.app, f"{model_name} configuration", modal=False ) - self.emane_model_dialog.columnconfigure(0, weight=1) - self.emane_model_dialog.rowconfigure(0, weight=1) + self.emane_model_dialog.top.columnconfigure(0, weight=1) + self.emane_model_dialog.top.rowconfigure(0, weight=1) # query for configurations session_id = self.app.core.session_id @@ -165,12 +167,12 @@ class EmaneConfiguration(Dialog): self.model_options = response.config self.model_config_frame = ConfigFrame( - self.emane_model_dialog, config=self.model_options + self.emane_model_dialog.top, config=self.model_options ) self.model_config_frame.grid(sticky="nsew") self.model_config_frame.draw_config() - frame = ttk.Frame(self.emane_model_dialog) + frame = ttk.Frame(self.emane_model_dialog.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) @@ -268,22 +270,24 @@ class EmaneConfiguration(Dialog): :return: nothing """ # draw label - lbl = ttk.Label(self, text="Emane") + lbl = ttk.Label(self.top, text="Emane") lbl.grid(row=1, column=0) # main frame that has emane wiki, a short description, emane models and the configure buttons - f = ttk.Frame(self) + f = ttk.Frame(self.top) f.columnconfigure(0, weight=1) + image = Images.get(ImageEnum.EDITNODE, 16) b = ttk.Button( f, - image=Images.get(ImageEnum.EDITNODE, 8), + image=image, text="EMANE Wiki", compound=tk.RIGHT, command=lambda: webbrowser.open_new( "https://github.com/adjacentlink/emane/wiki" ), ) + b.image = image b.grid(row=0, column=0, sticky="w") lbl = ttk.Label( @@ -302,8 +306,8 @@ class EmaneConfiguration(Dialog): f.grid(row=2, column=0, sticky="nsew") def draw_ip_subnets(self): - self.draw_text_label_and_entry(self, "IPv4 subnet", "") - self.draw_text_label_and_entry(self, "IPv6 subnet", "") + self.draw_text_label_and_entry(self.top, "IPv4 subnet", "") + self.draw_text_label_and_entry(self.top, "IPv6 subnet", "") def emane_options(self): """ @@ -311,7 +315,7 @@ class EmaneConfiguration(Dialog): :return: """ - f = ttk.Frame(self) + f = ttk.Frame(self.top) f.columnconfigure(0, weight=1) f.columnconfigure(1, weight=1) b = ttk.Button(f, text="Link to all routers") @@ -326,7 +330,7 @@ class EmaneConfiguration(Dialog): self.destroy() def draw_apply_and_cancel(self): - f = ttk.Frame(self) + f = ttk.Frame(self.top) f.columnconfigure(0, weight=1) f.columnconfigure(1, weight=1) b = ttk.Button(f, text="Apply", command=self.apply) diff --git a/coretk/coretk/dialogs/hooks.py b/coretk/coretk/dialogs/hooks.py index 5ae9da8a..dc677e12 100644 --- a/coretk/coretk/dialogs/hooks.py +++ b/coretk/coretk/dialogs/hooks.py @@ -15,11 +15,11 @@ class HookDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(1, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(1, weight=1) # name and states - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=0, sticky="ew", pady=2) frame.columnconfigure(0, weight=2) frame.columnconfigure(1, weight=7) @@ -39,7 +39,7 @@ class HookDialog(Dialog): combobox.bind("<>", self.state_change) # data - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) frame.grid(row=1, sticky="nsew", pady=2) @@ -59,7 +59,7 @@ class HookDialog(Dialog): scrollbar.config(command=self.data.yview) # button row - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=2, sticky="ew", pady=2) for i in range(2): frame.columnconfigure(i, weight=1) @@ -99,14 +99,16 @@ class HooksDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) - self.listbox = tk.Listbox(self) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) + + self.listbox = tk.Listbox(self.top) self.listbox.grid(row=0, sticky="nsew") self.listbox.bind("<>", self.select) for hook_file in self.app.core.hooks: self.listbox.insert(tk.END, hook_file) - frame = ttk.Frame(self) + + frame = ttk.Frame(self.top) frame.grid(row=1, sticky="ew") for i in range(4): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/icondialog.py b/coretk/coretk/dialogs/icondialog.py index 15d8000b..c5518f28 100644 --- a/coretk/coretk/dialogs/icondialog.py +++ b/coretk/coretk/dialogs/icondialog.py @@ -15,10 +15,10 @@ class IconDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) # row one - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=0, column=0, pady=2, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=3) @@ -30,11 +30,11 @@ class IconDialog(Dialog): button.grid(row=0, column=2) # row two - self.image_label = ttk.Label(self, image=self.image, anchor=tk.CENTER) + self.image_label = ttk.Label(self.top, image=self.image, anchor=tk.CENTER) self.image_label.grid(row=1, column=0, pady=2, sticky="ew") # row three - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=2, column=0, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) diff --git a/coretk/coretk/dialogs/mobilityconfig.py b/coretk/coretk/dialogs/mobilityconfig.py index 68c557ee..1f53b4a0 100644 --- a/coretk/coretk/dialogs/mobilityconfig.py +++ b/coretk/coretk/dialogs/mobilityconfig.py @@ -1,7 +1,7 @@ """ mobility configuration """ - +import logging import tkinter as tk from tkinter import filedialog, ttk @@ -9,7 +9,7 @@ from coretk import appconfig from coretk.dialogs.dialog import Dialog -class MobilityConfiguration(Dialog): +class MobilityConfigDialog(Dialog): def __init__(self, master, app, canvas_node): """ create an instance of mobility configuration @@ -19,7 +19,7 @@ class MobilityConfiguration(Dialog): """ super().__init__(master, app, "ns2script configuration", modal=True) self.canvas_node = canvas_node - print(app.canvas.core.mobilityconfig_management.configurations) + logging.info(app.canvas.core.mobilityconfig_management.configurations) self.node_config = app.canvas.core.mobilityconfig_management.configurations[ canvas_node.core_id ] @@ -57,11 +57,11 @@ class MobilityConfiguration(Dialog): def create_label_entry_filebrowser( self, parent_frame, text_label, entry_text, filebrowser=False ): - f = ttk.Frame(parent_frame, bg="#d9d9d9") - lbl = ttk.Label(f, text=text_label, bg="#d9d9d9") + f = ttk.Frame(parent_frame) + lbl = ttk.Label(f, text=text_label) lbl.grid(padx=3, pady=3) # f.grid() - e = ttk.Entry(f, textvariable=self.create_string_var(entry_text), bg="#ffffff") + e = ttk.Entry(f, textvariable=self.create_string_var(entry_text)) e.grid(row=0, column=1, padx=3, pady=3) if filebrowser: b = ttk.Button(f, text="...", command=lambda: self.open_file(e)) @@ -69,16 +69,14 @@ class MobilityConfiguration(Dialog): f.grid(sticky=tk.E) def mobility_script_parameters(self): - lbl = ttk.Label(self, text="node ns2script") + lbl = ttk.Label(self.top, text="node ns2script") lbl.grid(sticky="ew") - sb = ttk.Scrollbar(self, orient=tk.VERTICAL) + sb = ttk.Scrollbar(self.top, orient=tk.VERTICAL) sb.grid(row=1, column=1, sticky="ns") - f = ttk.Frame(self, bg="#d9d9d9") - lbl = ttk.Label( - f, text="ns-2 Mobility Scripts Parameters", bg="#d9d9d9", relief=tk.RAISED - ) + f = ttk.Frame(self.top) + lbl = ttk.Label(f, text="ns-2 Mobility Scripts Parameters") lbl.grid(row=0, column=0, sticky=tk.W) f1 = tk.Canvas( @@ -229,7 +227,7 @@ class MobilityConfiguration(Dialog): :return: nothing """ - f = ttk.Frame(self) + f = ttk.Frame(self.top) b = ttk.Button(f, text="Apply", command=self.ns2script_apply) b.grid() b = ttk.Button(f, text="Cancel", command=self.destroy) diff --git a/coretk/coretk/dialogs/nodeconfig.py b/coretk/coretk/dialogs/nodeconfig.py index ce7261e2..48233762 100644 --- a/coretk/coretk/dialogs/nodeconfig.py +++ b/coretk/coretk/dialogs/nodeconfig.py @@ -26,13 +26,13 @@ class NodeConfigDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_first_row() self.draw_second_row() self.draw_third_row() def draw_first_row(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=0, column=0, pady=2, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) @@ -55,7 +55,7 @@ class NodeConfigDialog(Dialog): combobox.grid(row=0, column=2, sticky="ew") def draw_second_row(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=1, column=0, pady=2, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) @@ -73,7 +73,7 @@ class NodeConfigDialog(Dialog): self.image_button.grid(row=0, column=1, sticky="ew") def draw_third_row(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(row=2, column=0, sticky="ew") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) diff --git a/coretk/coretk/dialogs/nodeservice.py b/coretk/coretk/dialogs/nodeservice.py index 49cc56d8..ce5a4715 100644 --- a/coretk/coretk/dialogs/nodeservice.py +++ b/coretk/coretk/dialogs/nodeservice.py @@ -22,10 +22,10 @@ class NodeService(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(stick="nsew") frame.rowconfigure(0, weight=1) for i in range(3): @@ -47,7 +47,7 @@ class NodeService(Dialog): for service in sorted(self.current_services): self.current.listbox.insert(tk.END, service) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(stick="ew") for i in range(3): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/observers.py b/coretk/coretk/dialogs/observers.py index 6c57f08e..78c5811f 100644 --- a/coretk/coretk/dialogs/observers.py +++ b/coretk/coretk/dialogs/observers.py @@ -18,15 +18,15 @@ class ObserverDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) self.draw_listbox() self.draw_form_fields() self.draw_config_buttons() self.draw_apply_buttons() def draw_listbox(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="nsew") frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) @@ -45,7 +45,7 @@ class ObserverDialog(Dialog): scrollbar.config(command=self.observers.yview) def draw_form_fields(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") frame.columnconfigure(1, weight=1) @@ -60,7 +60,7 @@ class ObserverDialog(Dialog): entry.grid(row=1, column=1, sticky="ew") def draw_config_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") for i in range(3): frame.columnconfigure(i, weight=1) @@ -79,7 +79,7 @@ class ObserverDialog(Dialog): self.delete_button.grid(row=0, column=2, sticky="ew") def draw_apply_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/preferences.py b/coretk/coretk/dialogs/preferences.py index 74293a30..0c426d3c 100644 --- a/coretk/coretk/dialogs/preferences.py +++ b/coretk/coretk/dialogs/preferences.py @@ -15,12 +15,12 @@ class PreferencesDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_programs() self.draw_buttons() def draw_programs(self): - frame = ttk.LabelFrame(self, text="Programs") + frame = ttk.LabelFrame(self.top, text="Programs") frame.grid(sticky="ew", pady=2) frame.columnconfigure(1, weight=1) @@ -47,7 +47,7 @@ class PreferencesDialog(Dialog): entry.grid(row=2, column=1, sticky="ew") def draw_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/servers.py b/coretk/coretk/dialogs/servers.py index 25f3e826..d3db22e7 100644 --- a/coretk/coretk/dialogs/servers.py +++ b/coretk/coretk/dialogs/servers.py @@ -23,15 +23,15 @@ class ServersDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) self.draw_servers() self.draw_server_configuration() self.draw_servers_buttons() self.draw_apply_buttons() def draw_servers(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="nsew") frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) @@ -51,10 +51,10 @@ class ServersDialog(Dialog): scrollbar.config(command=self.servers.yview) def draw_server_configuration(self): - label = ttk.Label(self, text="Server Configuration") + label = ttk.Label(self.top, text="Server Configuration") label.grid(pady=2, sticky="ew") - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) @@ -76,7 +76,7 @@ class ServersDialog(Dialog): entry.grid(row=0, column=5, sticky="ew") def draw_servers_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") for i in range(3): frame.columnconfigure(i, weight=1) @@ -95,7 +95,7 @@ class ServersDialog(Dialog): self.delete_button.grid(row=0, column=2, sticky="ew") def draw_apply_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/serviceconfiguration.py b/coretk/coretk/dialogs/serviceconfiguration.py index b0b35db9..29f844b5 100644 --- a/coretk/coretk/dialogs/serviceconfiguration.py +++ b/coretk/coretk/dialogs/serviceconfiguration.py @@ -34,7 +34,7 @@ class ServiceConfiguration(Dialog): def draw(self): # self.columnconfigure(1, weight=1) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame1 = ttk.Frame(frame) label = ttk.Label(frame1, text=self.service_name) label.grid(row=0, column=0, sticky="ew") @@ -49,7 +49,7 @@ class ServiceConfiguration(Dialog): frame2.grid(row=1, column=0) frame.grid(row=0, column=0) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) self.tab_parent = ttk.Notebook(frame) tab1 = ttk.Frame(self.tab_parent) tab2 = ttk.Frame(self.tab_parent) @@ -190,11 +190,11 @@ class ServiceConfiguration(Dialog): frame.grid(row=2 + i, column=0, sticky="nsew") button = ttk.Button( - self, text="onle store values that have changed from their defaults" + self.top, text="onle store values that have changed from their defaults" ) button.grid(row=2, column=0) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) button = ttk.Button(frame, text="Apply", command=self.click_apply) button.grid(row=0, column=0, sticky="nsew") button = ttk.Button( diff --git a/coretk/coretk/dialogs/sessionoptions.py b/coretk/coretk/dialogs/sessionoptions.py index 45f26a58..8cd7ad68 100644 --- a/coretk/coretk/dialogs/sessionoptions.py +++ b/coretk/coretk/dialogs/sessionoptions.py @@ -15,18 +15,18 @@ class SessionOptionsDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) - self.rowconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) + self.top.rowconfigure(0, weight=1) session_id = self.app.core.session_id response = self.app.core.client.get_session_options(session_id) logging.info("session options: %s", response) - self.config_frame = ConfigFrame(self, config=response.config) + self.config_frame = ConfigFrame(self.top, config=response.config) self.config_frame.draw_config() self.config_frame.grid(sticky="nsew") - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) diff --git a/coretk/coretk/dialogs/sessions.py b/coretk/coretk/dialogs/sessions.py index b9b7d77b..6ea66973 100644 --- a/coretk/coretk/dialogs/sessions.py +++ b/coretk/coretk/dialogs/sessions.py @@ -16,7 +16,7 @@ class SessionsDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_description() self.draw_tree() self.draw_buttons() @@ -27,7 +27,7 @@ class SessionsDialog(Dialog): :return: nothing """ label = ttk.Label( - self, + self.top, text="Below is a list of active CORE sessions. Double-click to \n" "connect to an existing session. Usually, only sessions in \n" "the RUNTIME state persist in the daemon, except for the \n" @@ -37,7 +37,7 @@ class SessionsDialog(Dialog): def draw_tree(self): self.tree = ttk.Treeview( - self, columns=("id", "state", "nodes"), show="headings" + self.top, columns=("id", "state", "nodes"), show="headings" ) self.tree.grid(row=1, sticky="nsew") self.tree.column("id", stretch=tk.YES) @@ -60,16 +60,18 @@ class SessionsDialog(Dialog): self.tree.bind("", self.on_selected) self.tree.bind("<>", self.click_select) - yscrollbar = ttk.Scrollbar(self, orient="vertical", command=self.tree.yview) + yscrollbar = ttk.Scrollbar(self.top, orient="vertical", command=self.tree.yview) yscrollbar.grid(row=1, column=1, sticky="ns") self.tree.configure(yscrollcommand=yscrollbar.set) - xscrollbar = ttk.Scrollbar(self, orient="horizontal", command=self.tree.xview) + xscrollbar = ttk.Scrollbar( + self.top, orient="horizontal", command=self.tree.xview + ) xscrollbar.grid(row=2, sticky="ew", pady=5) self.tree.configure(xscrollcommand=xscrollbar.set) def draw_buttons(self): - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) for i in range(4): frame.columnconfigure(i, weight=1) frame.grid(row=3, sticky="ew") diff --git a/coretk/coretk/dialogs/wlanconfig.py b/coretk/coretk/dialogs/wlanconfig.py index d33f7ca0..85a2a18f 100644 --- a/coretk/coretk/dialogs/wlanconfig.py +++ b/coretk/coretk/dialogs/wlanconfig.py @@ -7,6 +7,7 @@ from tkinter import ttk from coretk.dialogs.dialog import Dialog from coretk.dialogs.icondialog import IconDialog +from coretk.dialogs.mobilityconfig import MobilityConfigDialog class WlanConfigDialog(Dialog): @@ -30,7 +31,7 @@ class WlanConfigDialog(Dialog): self.draw() def draw(self): - self.columnconfigure(0, weight=1) + self.top.columnconfigure(0, weight=1) self.draw_name_config() self.draw_wlan_config() self.draw_subnet() @@ -43,7 +44,7 @@ class WlanConfigDialog(Dialog): :return: nothing """ - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") frame.columnconfigure(0, weight=1) @@ -59,10 +60,10 @@ class WlanConfigDialog(Dialog): :return: nothing """ - label = ttk.Label(self, text="Wireless") + label = ttk.Label(self.top, text="Wireless") label.grid(sticky="w", pady=2) - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) @@ -108,7 +109,7 @@ class WlanConfigDialog(Dialog): :return: nothing """ - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=3, sticky="ew") frame.columnconfigure(1, weight=1) frame.columnconfigure(3, weight=1) @@ -130,12 +131,14 @@ class WlanConfigDialog(Dialog): :return: """ - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(pady=2, sticky="ew") for i in range(3): frame.columnconfigure(i, weight=1) - button = ttk.Button(frame, text="ns-2 mobility script...") + button = ttk.Button( + frame, text="ns-2 mobility script...", command=self.click_mobility + ) button.grid(row=0, column=0, padx=2, sticky="ew") button = ttk.Button(frame, text="Link to all routers") @@ -150,7 +153,7 @@ class WlanConfigDialog(Dialog): :return: nothing """ - frame = ttk.Frame(self) + frame = ttk.Frame(self.top) frame.grid(sticky="ew") for i in range(2): frame.columnconfigure(i, weight=1) @@ -161,6 +164,10 @@ class WlanConfigDialog(Dialog): button = ttk.Button(frame, text="Cancel", command=self.destroy) button.grid(row=0, column=1, padx=2, sticky="ew") + def click_mobility(self): + dialog = MobilityConfigDialog(self, self.app, self.canvas_node) + dialog.show() + def click_icon(self): dialog = IconDialog( self, self.app, self.canvas_node.name, self.canvas_node.image diff --git a/coretk/coretk/theme.py b/coretk/coretk/theme.py deleted file mode 100644 index 9525d35e..00000000 --- a/coretk/coretk/theme.py +++ /dev/null @@ -1,162 +0,0 @@ -import tkinter as tk -from tkinter import ttk - - -class Colors: - disabledfg = "DarkGrey" - frame = "#424242" - dark = "#222222" - darker = "#121212" - darkest = "black" - lighter = "#626262" - lightest = "#ffffff" - selectbg = "#4a6984" - selectfg = "#ffffff" - white = "white" - black = "black" - - -style = ttk.Style() -style.theme_create( - "black", - "clam", - { - ".": { - "configure": { - "background": Colors.frame, - "foreground": Colors.white, - "bordercolor": Colors.darkest, - "darkcolor": Colors.dark, - "lightcolor": Colors.lighter, - "troughcolor": Colors.darker, - "selectbackground": Colors.selectbg, - "selectforeground": Colors.selectfg, - "selectborderwidth": 0, - "font": "TkDefaultFont", - }, - "map": { - "background": [("disabled", Colors.frame), ("active", Colors.lighter)], - "foreground": [("disabled", Colors.disabledfg)], - "selectbackground": [("!focus", Colors.darkest)], - "selectforeground": [("!focus", Colors.white)], - }, - }, - "TButton": { - "configure": {"width": 8, "padding": (5, 1), "relief": tk.RAISED}, - "map": { - "relief": [("pressed", tk.SUNKEN)], - "shiftrelief": [("pressed", 1)], - }, - }, - "TMenubutton": { - "configure": {"width": 11, "padding": (5, 1), "relief": tk.RAISED} - }, - "TCheckbutton": { - "configure": { - "indicatorbackground": Colors.white, - "indicatormargin": (1, 1, 4, 1), - } - }, - "TRadiobutton": { - "configure": { - "indicatorbackground": Colors.white, - "indicatormargin": (1, 1, 4, 1), - } - }, - "TEntry": { - "configure": { - "fieldbackground": Colors.white, - "foreground": Colors.black, - "padding": (2, 0), - } - }, - "TCombobox": { - "configure": { - "fieldbackground": Colors.white, - "foreground": Colors.black, - "padding": (2, 0), - } - }, - "TNotebook.Tab": { - "configure": {"padding": (6, 2, 6, 2)}, - "map": {"background": [("selected", Colors.lighter)]}, - }, - "Treeview": { - "configure": { - "fieldbackground": Colors.white, - "background": Colors.white, - "foreground": Colors.black, - }, - "map": { - "background": [("selected", Colors.selectbg)], - "foreground": [("selected", Colors.selectfg)], - }, - }, - }, -) -style.theme_use("black") - - -def update_menu(event): - bg = style.lookup(".", "background") - fg = style.lookup(".", "foreground") - abg = style.lookup(".", "lightcolor") - event.widget.config( - background=bg, foreground=fg, activebackground=abg, activeforeground=fg - ) - - -class Application(ttk.Frame): - def __init__(self, master=None): - super().__init__(master) - self.master.bind_class("Menu", "<>", update_menu) - self.master.geometry("800x600") - menu = tk.Menu(self.master) - menu.add_command(label="Command1") - menu.add_command(label="Command2") - submenu = tk.Menu(menu, tearoff=False) - submenu.add_command(label="Command1") - submenu.add_command(label="Command2") - menu.add_cascade(label="Submenu", menu=submenu) - self.master.config(menu=menu) - self.master.columnconfigure(0, weight=1) - self.master.rowconfigure(0, weight=1) - notebook = ttk.Notebook(self.master) - notebook.grid(sticky="nsew") - frame = ttk.Frame(notebook) - frame.grid(sticky="nsew") - ttk.Label(frame, text="Label").grid() - ttk.Entry(frame).grid() - ttk.Button(frame, text="Button").grid() - ttk.Combobox(frame, values=("one", "two", "three")).grid() - menubutton = ttk.Menubutton(frame, text="MenuButton") - menubutton.grid() - mbmenu = tk.Menu(menubutton, tearoff=False) - menubutton.config(menu=mbmenu) - mbmenu.add_command(label="Menu1") - mbmenu.add_command(label="Menu2") - submenu = tk.Menu(mbmenu, tearoff=False) - submenu.add_command(label="Command1") - submenu.add_command(label="Command2") - mbmenu.add_cascade(label="Submenu", menu=submenu) - ttk.Radiobutton(frame, text="Radio Button").grid() - ttk.Checkbutton(frame, text="Check Button").grid() - tv = ttk.Treeview(frame, columns=("one", "two", "three"), show="headings") - tv.grid() - tv.column("one", stretch=tk.YES) - tv.heading("one", text="ID") - tv.column("two", stretch=tk.YES) - tv.heading("two", text="State") - tv.column("three", stretch=tk.YES) - tv.heading("three", text="Node Count") - tv.insert("", tk.END, text="1", values=("v1", "v2", "v3")) - tv.insert("", tk.END, text="2", values=("v1", "v2", "v3")) - notebook.add(frame, text="Tab1") - frame = ttk.Frame(notebook) - frame.grid(sticky="nsew") - notebook.add(frame, text="Tab2") - - -if __name__ == "__main__": - app = Application() - app.mainloop() diff --git a/coretk/coretk/themes.py b/coretk/coretk/themes.py new file mode 100644 index 00000000..b661b644 --- /dev/null +++ b/coretk/coretk/themes.py @@ -0,0 +1,127 @@ +import tkinter as tk + +DARK = "black" + + +class Styles: + tooltip = "Tooltip.TLabel" + tooltip_frame = "Tooltip.TFrame" + + +class Colors: + disabledfg = "DarkGrey" + frame = "#424242" + dark = "#222222" + darker = "#121212" + darkest = "black" + lighter = "#626262" + lightest = "#ffffff" + selectbg = "#4a6984" + selectfg = "#ffffff" + white = "white" + black = "black" + + +def load(style): + style.theme_create( + DARK, + "clam", + { + ".": { + "configure": { + "background": Colors.frame, + "foreground": Colors.white, + "bordercolor": Colors.darkest, + "darkcolor": Colors.dark, + "lightcolor": Colors.lighter, + "troughcolor": Colors.darker, + "selectbackground": Colors.selectbg, + "selectforeground": Colors.selectfg, + "selectborderwidth": 0, + "font": "TkDefaultFont", + }, + "map": { + "background": [ + ("disabled", Colors.frame), + ("active", Colors.lighter), + ], + "foreground": [("disabled", Colors.disabledfg)], + "selectbackground": [("!focus", Colors.darkest)], + "selectforeground": [("!focus", Colors.white)], + }, + }, + "TButton": { + "configure": {"width": 8, "padding": (5, 1), "relief": tk.RAISED}, + "map": { + "relief": [("pressed", tk.SUNKEN)], + "shiftrelief": [("pressed", 1)], + }, + }, + "TMenubutton": { + "configure": {"width": 11, "padding": (5, 1), "relief": tk.RAISED} + }, + "TCheckbutton": { + "configure": { + "indicatorbackground": Colors.white, + "indicatormargin": (1, 1, 4, 1), + } + }, + "TRadiobutton": { + "configure": { + "indicatorbackground": Colors.white, + "indicatormargin": (1, 1, 4, 1), + } + }, + "TEntry": { + "configure": { + "fieldbackground": Colors.white, + "foreground": Colors.black, + "padding": (2, 0), + } + }, + "TCombobox": { + "configure": { + "fieldbackground": Colors.white, + "foreground": Colors.black, + "padding": (2, 0), + } + }, + "TNotebook.Tab": { + "configure": {"padding": (6, 2, 6, 2)}, + "map": {"background": [("selected", Colors.lighter)]}, + }, + "Treeview": { + "configure": { + "fieldbackground": Colors.white, + "background": Colors.white, + "foreground": Colors.black, + }, + "map": { + "background": [("selected", Colors.selectbg)], + "foreground": [("selected", Colors.selectfg)], + }, + }, + Styles.tooltip: { + "configure": {"justify": tk.LEFT, "relief": tk.SOLID, "borderwidth": 0} + }, + Styles.tooltip_frame: {"configure": {}}, + }, + ) + + +def update_toplevel(style, event): + if not isinstance(event.widget, tk.Toplevel): + return + bg = style.lookup(".", "background") + event.widget.config(background=bg) + + +def update_menu(style, event): + if not isinstance(event.widget, tk.Menu): + return + bg = style.lookup(".", "background") + fg = style.lookup(".", "foreground") + abg = style.lookup(".", "lightcolor") + event.widget.config( + background=bg, foreground=fg, activebackground=abg, activeforeground=fg + ) diff --git a/coretk/coretk/tooltip.py b/coretk/coretk/tooltip.py index 1877fd24..9a3f7ade 100644 --- a/coretk/coretk/tooltip.py +++ b/coretk/coretk/tooltip.py @@ -1,6 +1,8 @@ import tkinter as tk from tkinter import ttk +from coretk.themes import Styles + class Tooltip(object): """ @@ -41,15 +43,12 @@ class Tooltip(object): self.tw = tk.Toplevel(self.widget) self.tw.wm_overrideredirect(True) self.tw.wm_geometry("+%d+%d" % (x, y)) - label = ttk.Label( - self.tw, - text=self.text, - justify=tk.LEFT, - background="#FFFFEA", - relief=tk.SOLID, - borderwidth=0, - ) - label.grid(padx=1) + self.tw.rowconfigure(0, weight=1) + self.tw.columnconfigure(0, weight=1) + frame = ttk.Frame(self.tw, style=Styles.tooltip_frame, padding=3) + frame.grid(sticky="nsew") + label = ttk.Label(frame, text=self.text, style=Styles.tooltip) + label.grid() def close(self, event=None): if self.tw: diff --git a/coretk/coretk/widgets.py b/coretk/coretk/widgets.py index 9ae9e851..87651701 100644 --- a/coretk/coretk/widgets.py +++ b/coretk/coretk/widgets.py @@ -17,9 +17,9 @@ INT_TYPES = { } -class FrameScroll(tk.LabelFrame): - def __init__(self, master=None, cnf={}, _cls=tk.Frame, **kw): - super().__init__(master, cnf, **kw) +class FrameScroll(ttk.LabelFrame): + def __init__(self, master=None, _cls=tk.Frame, **kw): + super().__init__(master, **kw) self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.canvas = tk.Canvas(self, highlightthickness=0) @@ -54,8 +54,8 @@ class FrameScroll(tk.LabelFrame): class ConfigFrame(FrameScroll): - def __init__(self, master=None, cnf={}, config=None, **kw): - super().__init__(master, cnf, ttk.Notebook, **kw) + def __init__(self, master=None, config=None, **kw): + super().__init__(master, ttk.Notebook, **kw) self.config = config self.values = {} @@ -126,9 +126,9 @@ class ConfigFrame(FrameScroll): return {x: self.config[x].value for x in self.config} -class ListboxScroll(tk.LabelFrame): - def __init__(self, master=None, cnf={}, **kw): - super().__init__(master, cnf, **kw) +class ListboxScroll(ttk.LabelFrame): + def __init__(self, master=None, **kw): + super().__init__(master, **kw) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.scrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL) @@ -141,8 +141,8 @@ class ListboxScroll(tk.LabelFrame): class CheckboxList(FrameScroll): - def __init__(self, master=None, cnf={}, clicked=None, **kw): - super().__init__(master, cnf, **kw) + def __init__(self, master=None, clicked=None, **kw): + super().__init__(master, **kw) self.clicked = clicked self.frame.columnconfigure(0, weight=1)