spacr 0.1.81__py3-none-any.whl → 0.1.85__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spacr/gui.py +33 -14
- spacr/gui_core.py +77 -58
- spacr/gui_elements.py +136 -79
- spacr/test_gui.py +0 -0
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/METADATA +1 -1
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/RECORD +10 -9
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/LICENSE +0 -0
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/WHEEL +0 -0
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/entry_points.txt +0 -0
- {spacr-0.1.81.dist-info → spacr-0.1.85.dist-info}/top_level.txt +0 -0
spacr/gui.py
CHANGED
@@ -11,11 +11,12 @@ class MainApp(tk.Tk):
|
|
11
11
|
super().__init__()
|
12
12
|
width = self.winfo_screenwidth()
|
13
13
|
height = self.winfo_screenheight()
|
14
|
-
self.geometry(f"{width}x{height}")
|
14
|
+
self.geometry(f"{width}x{height}")
|
15
15
|
self.title("SpaCr GUI Collection")
|
16
|
-
|
16
|
+
|
17
|
+
# Initialize style and apply dark style to the main window
|
17
18
|
style = ttk.Style()
|
18
|
-
set_dark_style(style)
|
19
|
+
self.color_settings = set_dark_style(style, parent_frame=self)
|
19
20
|
|
20
21
|
self.main_gui_apps = {
|
21
22
|
"Mask": (lambda frame: initiate_root(frame, 'mask'), "Generate cellpose masks for cells, nuclei and pathogen images."),
|
@@ -50,15 +51,18 @@ class MainApp(tk.Tk):
|
|
50
51
|
create_menu_bar(self)
|
51
52
|
|
52
53
|
# Create a canvas to hold the selected app and other elements
|
53
|
-
self.canvas = tk.Canvas(self,
|
54
|
+
self.canvas = tk.Canvas(self, highlightthickness=0)
|
54
55
|
self.canvas.grid(row=0, column=0, sticky="nsew")
|
55
56
|
self.grid_rowconfigure(0, weight=1)
|
56
57
|
self.grid_columnconfigure(0, weight=1)
|
57
58
|
|
58
59
|
# Create a frame inside the canvas to hold the main content
|
59
|
-
self.content_frame = tk.Frame(self.canvas
|
60
|
+
self.content_frame = tk.Frame(self.canvas)
|
60
61
|
self.content_frame.pack(fill=tk.BOTH, expand=True)
|
61
62
|
|
63
|
+
# Apply dark style to canvas and content_frame
|
64
|
+
set_dark_style(ttk.Style(), containers=[self.canvas, self.content_frame])
|
65
|
+
|
62
66
|
# Create startup screen with buttons for each main GUI app and drop-down for additional apps
|
63
67
|
self.create_startup_screen()
|
64
68
|
|
@@ -66,19 +70,25 @@ class MainApp(tk.Tk):
|
|
66
70
|
self.clear_frame(self.content_frame)
|
67
71
|
|
68
72
|
# Create a frame for the logo and description
|
69
|
-
logo_frame = tk.Frame(self.content_frame
|
73
|
+
logo_frame = tk.Frame(self.content_frame)
|
70
74
|
logo_frame.pack(pady=20, expand=True)
|
75
|
+
set_dark_style(ttk.Style(), containers=[logo_frame])
|
71
76
|
|
72
77
|
# Load the logo image
|
73
78
|
if not self.load_logo(logo_frame):
|
74
|
-
tk.Label(logo_frame, text="Logo not found",
|
79
|
+
logo_not_found = tk.Label(logo_frame, text="Logo not found", font=('Helvetica', 24))
|
80
|
+
logo_not_found.pack(padx=10, pady=10)
|
81
|
+
set_dark_style(ttk.Style(), widgets=[logo_not_found])
|
75
82
|
|
76
83
|
# Add SpaCr text below the logo with padding for sharper text
|
77
|
-
tk.Label(logo_frame, text="SpaCr",
|
84
|
+
spacr_label = tk.Label(logo_frame, text="SpaCr", fg=self.color_settings['active_color'], font=('Helvetica', 24))
|
85
|
+
spacr_label.pack(padx=10, pady=10)
|
86
|
+
set_dark_style(ttk.Style(), widgets=[spacr_label])
|
78
87
|
|
79
88
|
# Create a frame for the buttons and descriptions
|
80
|
-
buttons_frame = tk.Frame(self.content_frame
|
89
|
+
buttons_frame = tk.Frame(self.content_frame)
|
81
90
|
buttons_frame.pack(pady=10, expand=True, padx=10)
|
91
|
+
set_dark_style(ttk.Style(), containers=[buttons_frame])
|
82
92
|
|
83
93
|
for i, (app_name, app_data) in enumerate(self.main_gui_apps.items()):
|
84
94
|
app_func, app_desc = app_data
|
@@ -87,17 +97,24 @@ class MainApp(tk.Tk):
|
|
87
97
|
button = spacrButton(buttons_frame, text=app_name, command=lambda app_name=app_name, app_func=app_func: self.load_app(app_name, app_func), font=('Helvetica', 12))
|
88
98
|
button.grid(row=i, column=0, pady=10, padx=10, sticky="w")
|
89
99
|
|
90
|
-
description_label = tk.Label(buttons_frame, text=app_desc,
|
100
|
+
description_label = tk.Label(buttons_frame, text=app_desc, wraplength=800, justify="left", font=('Helvetica', 12))
|
91
101
|
description_label.grid(row=i, column=1, pady=10, padx=10, sticky="w")
|
102
|
+
set_dark_style(ttk.Style(), widgets=[description_label])
|
92
103
|
|
93
104
|
# Add drop-down menu for additional apps
|
94
|
-
dropdown_frame = tk.Frame(buttons_frame
|
105
|
+
dropdown_frame = tk.Frame(buttons_frame)
|
95
106
|
dropdown_frame.grid(row=len(self.main_gui_apps), column=0, columnspan=2, pady=20)
|
107
|
+
set_dark_style(ttk.Style(), containers=[dropdown_frame])
|
108
|
+
|
109
|
+
additional_apps_label = tk.Label(dropdown_frame, text="Additional Apps", font=('Helvetica', 12))
|
110
|
+
additional_apps_label.pack(side=tk.LEFT, padx=5)
|
111
|
+
set_dark_style(ttk.Style(), widgets=[additional_apps_label])
|
96
112
|
|
97
|
-
tk.Label(dropdown_frame, text="Additional Apps", bg="black", fg="white", font=('Helvetica', 12)).pack(side=tk.LEFT, padx=5)
|
98
113
|
self.additional_apps_var = tk.StringVar(value="Select an app")
|
99
114
|
dropdown = ttk.Combobox(dropdown_frame, textvariable=self.additional_apps_var, values=list(self.additional_gui_apps.keys()))
|
100
115
|
dropdown.pack(side=tk.LEFT, padx=5)
|
116
|
+
set_dark_style(ttk.Style(), widgets=[dropdown])
|
117
|
+
|
101
118
|
load_button = spacrButton(dropdown_frame, text="Load", command=self.load_additional_app, font=('Helvetica', 12))
|
102
119
|
load_button.pack(side=tk.LEFT, padx=5)
|
103
120
|
|
@@ -141,9 +158,10 @@ class MainApp(tk.Tk):
|
|
141
158
|
new_height = int(screen_height // 4)
|
142
159
|
logo_image = logo_image.resize((new_height, new_height), Image.Resampling.LANCZOS)
|
143
160
|
logo_photo = ImageTk.PhotoImage(logo_image)
|
144
|
-
logo_label = tk.Label(frame, image=logo_photo
|
161
|
+
logo_label = tk.Label(frame, image=logo_photo)
|
145
162
|
logo_label.image = logo_photo # Keep a reference to avoid garbage collection
|
146
163
|
logo_label.pack()
|
164
|
+
set_dark_style(ttk.Style(), widgets=[logo_label])
|
147
165
|
return True
|
148
166
|
except Exception as e:
|
149
167
|
print(f"An error occurred while processing the logo image: {e}")
|
@@ -154,8 +172,9 @@ class MainApp(tk.Tk):
|
|
154
172
|
self.clear_frame(self.content_frame)
|
155
173
|
|
156
174
|
# Initialize the selected app
|
157
|
-
app_frame = tk.Frame(self.content_frame
|
175
|
+
app_frame = tk.Frame(self.content_frame)
|
158
176
|
app_frame.pack(fill=tk.BOTH, expand=True)
|
177
|
+
set_dark_style(ttk.Style(), containers=[app_frame])
|
159
178
|
app_func(app_frame)
|
160
179
|
|
161
180
|
def load_additional_app(self):
|
spacr/gui_core.py
CHANGED
@@ -17,7 +17,7 @@ except AttributeError:
|
|
17
17
|
pass
|
18
18
|
|
19
19
|
from .settings import set_default_train_test_model, get_measure_crop_settings, set_default_settings_preprocess_generate_masks, get_analyze_reads_default_settings, set_default_umap_image_settings
|
20
|
-
from .gui_elements import
|
20
|
+
from .gui_elements import spacrButton, spacrLabel, spacrFrame, spacrDropdownMenu ,set_dark_style, set_default_font
|
21
21
|
|
22
22
|
# Define global variables
|
23
23
|
q = None
|
@@ -271,17 +271,16 @@ def convert_settings_dict_for_gui(settings):
|
|
271
271
|
|
272
272
|
def setup_settings_panel(vertical_container, settings_type='mask', window_dimensions=[500, 1000]):
|
273
273
|
global vars_dict, scrollable_frame
|
274
|
-
from .settings import
|
274
|
+
from .settings import get_identify_masks_finetune_default_settings, set_default_analyze_screen, set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model, get_analyze_reads_default_settings, set_default_umap_image_settings, generate_fields, get_perform_regression_default_settings, get_train_cellpose_default_settings, get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings
|
275
275
|
|
276
|
-
width = (window_dimensions[0])//6
|
276
|
+
width = (window_dimensions[0]) // 6
|
277
277
|
height = window_dimensions[1]
|
278
278
|
|
279
|
-
|
280
|
-
settings_frame = tk.Frame(vertical_container, bg='black', height=height, width=width)
|
279
|
+
settings_frame = tk.Frame(vertical_container)
|
281
280
|
vertical_container.add(settings_frame, stretch="always")
|
282
|
-
settings_label = spacrLabel(settings_frame, text="Settings",
|
281
|
+
settings_label = spacrLabel(settings_frame, text="Settings", anchor='center', justify='center', align="center")
|
283
282
|
settings_label.grid(row=0, column=0, pady=10, padx=10)
|
284
|
-
scrollable_frame = spacrFrame(settings_frame
|
283
|
+
scrollable_frame = spacrFrame(settings_frame)
|
285
284
|
scrollable_frame.grid(row=1, column=0, sticky="nsew")
|
286
285
|
settings_frame.grid_rowconfigure(1, weight=1)
|
287
286
|
settings_frame.grid_columnconfigure(0, weight=1)
|
@@ -310,24 +309,18 @@ def setup_settings_panel(vertical_container, settings_type='mask', window_dimens
|
|
310
309
|
settings = get_perform_regression_default_settings(settings={})
|
311
310
|
elif settings_type == 'recruitment':
|
312
311
|
settings = get_analyze_recruitment_default_settings(settings={})
|
313
|
-
#elif settings_type == 'simulation':
|
314
|
-
# settings = set_default_
|
315
|
-
#elif settings_type == 'cellpose_dataset':
|
316
|
-
# settings = set_default_
|
317
|
-
#elif settings_type == 'plaques':
|
318
|
-
# settings = set_default_
|
319
|
-
#elif settings_type == 'cellpose_compare':
|
320
|
-
# settings = set_default_
|
321
|
-
#elif settings_type == 'vision_scores':
|
322
|
-
# settings = set_default_
|
323
|
-
#elif settings_type == 'vision_dataset':
|
324
|
-
# settings = set_default_
|
325
312
|
else:
|
326
313
|
raise ValueError(f"Invalid settings type: {settings_type}")
|
327
314
|
|
328
|
-
|
329
315
|
variables = convert_settings_dict_for_gui(settings)
|
330
316
|
vars_dict = generate_fields(variables, scrollable_frame)
|
317
|
+
|
318
|
+
containers = [settings_frame]
|
319
|
+
widgets = [settings_label, scrollable_frame]
|
320
|
+
|
321
|
+
style = ttk.Style(vertical_container)
|
322
|
+
_ = set_dark_style(style, containers=containers, widgets=widgets)
|
323
|
+
|
331
324
|
print("Settings panel setup complete")
|
332
325
|
return scrollable_frame, vars_dict
|
333
326
|
|
@@ -335,45 +328,57 @@ def setup_plot_section(vertical_container):
|
|
335
328
|
global canvas, canvas_widget
|
336
329
|
plot_frame = tk.PanedWindow(vertical_container, orient=tk.VERTICAL)
|
337
330
|
vertical_container.add(plot_frame, stretch="always")
|
338
|
-
figure = Figure(figsize=(30, 4), dpi=100
|
331
|
+
figure = Figure(figsize=(30, 4), dpi=100)
|
339
332
|
plot = figure.add_subplot(111)
|
340
333
|
plot.plot([], []) # This creates an empty plot.
|
341
334
|
plot.axis('off')
|
342
335
|
canvas = FigureCanvasTkAgg(figure, master=plot_frame)
|
343
|
-
canvas.get_tk_widget().configure(cursor='arrow',
|
336
|
+
canvas.get_tk_widget().configure(cursor='arrow', highlightthickness=0)
|
344
337
|
canvas_widget = canvas.get_tk_widget()
|
345
338
|
plot_frame.add(canvas_widget, stretch="always")
|
346
339
|
canvas.draw()
|
347
340
|
canvas.figure = figure
|
341
|
+
# Set the figure and axes background to black
|
342
|
+
figure.patch.set_facecolor('black')
|
343
|
+
plot.set_facecolor('black')
|
344
|
+
containers = [plot_frame]
|
345
|
+
widgets = [canvas_widget]
|
346
|
+
style = ttk.Style(vertical_container)
|
347
|
+
_ = set_dark_style(style, containers=containers, widgets=widgets)
|
348
348
|
return canvas, canvas_widget
|
349
349
|
|
350
350
|
def setup_console(vertical_container):
|
351
351
|
global console_output
|
352
|
-
|
353
|
-
console_frame = tk.Frame(vertical_container, bg='black')
|
352
|
+
console_frame = tk.Frame(vertical_container)
|
354
353
|
vertical_container.add(console_frame, stretch="always")
|
355
|
-
console_label = spacrLabel(console_frame, text="Console",
|
354
|
+
console_label = spacrLabel(console_frame, text="Console", anchor='center', justify='center', align="center")
|
356
355
|
console_label.grid(row=0, column=0, pady=10, padx=10)
|
357
|
-
console_output = scrolledtext.ScrolledText(console_frame, height=10
|
356
|
+
console_output = scrolledtext.ScrolledText(console_frame, height=10)
|
358
357
|
console_output.grid(row=1, column=0, sticky="nsew")
|
359
358
|
console_frame.grid_rowconfigure(1, weight=1)
|
360
359
|
console_frame.grid_columnconfigure(0, weight=1)
|
361
|
-
|
360
|
+
containers = [console_frame]
|
361
|
+
widgets = [console_label, console_output]
|
362
|
+
style = ttk.Style(vertical_container)
|
363
|
+
_ = set_dark_style(style, containers=containers, widgets=widgets)
|
362
364
|
return console_output
|
363
365
|
|
364
366
|
def setup_progress_frame(vertical_container):
|
365
367
|
global progress_output
|
366
|
-
progress_frame = tk.Frame(vertical_container
|
368
|
+
progress_frame = tk.Frame(vertical_container)
|
367
369
|
vertical_container.add(progress_frame, stretch="always")
|
368
|
-
label_frame = tk.Frame(progress_frame
|
370
|
+
label_frame = tk.Frame(progress_frame)
|
369
371
|
label_frame.grid(row=0, column=0, sticky="ew", pady=(5, 0), padx=10)
|
370
|
-
progress_label = spacrLabel(label_frame, text="Processing: 0%",
|
372
|
+
progress_label = spacrLabel(label_frame, text="Processing: 0%", font=('Helvetica', 12), anchor='w', justify='left', align="left")
|
371
373
|
progress_label.grid(row=0, column=0, sticky="w")
|
372
|
-
progress_output = scrolledtext.ScrolledText(progress_frame, height=10
|
374
|
+
progress_output = scrolledtext.ScrolledText(progress_frame, height=10)
|
373
375
|
progress_output.grid(row=1, column=0, sticky="nsew")
|
374
376
|
progress_frame.grid_rowconfigure(1, weight=1)
|
375
377
|
progress_frame.grid_columnconfigure(0, weight=1)
|
376
|
-
|
378
|
+
containers = [progress_frame, label_frame]
|
379
|
+
widgets = [progress_label, progress_output]
|
380
|
+
style = ttk.Style(vertical_container)
|
381
|
+
_ = set_dark_style(style, containers=containers, widgets=widgets)
|
377
382
|
return progress_output
|
378
383
|
|
379
384
|
def download_hug_dataset():
|
@@ -459,60 +464,70 @@ def download_dataset(repo_id, subfolder, local_dir=None, retries=5, delay=5):
|
|
459
464
|
|
460
465
|
raise Exception("Failed to download files after multiple attempts.")
|
461
466
|
|
462
|
-
def setup_button_section(horizontal_container, settings_type='mask',
|
467
|
+
def setup_button_section(horizontal_container, settings_type='mask', window_dimensions=[500, 1000], run=True, abort=True, download=True, import_btn=True):
|
463
468
|
global button_frame, button_scrollable_frame, run_button, abort_button, download_dataset_button, import_button, q, fig_queue, vars_dict
|
464
469
|
from .settings import descriptions
|
465
470
|
|
466
|
-
width = (window_dimensions[0])//8
|
471
|
+
width = (window_dimensions[0]) // 8
|
467
472
|
height = window_dimensions[1]
|
468
473
|
|
469
|
-
button_frame = tk.Frame(horizontal_container
|
474
|
+
button_frame = tk.Frame(horizontal_container)
|
470
475
|
horizontal_container.add(button_frame, stretch="always", sticky="nsew")
|
471
476
|
button_frame.grid_rowconfigure(0, weight=0)
|
472
477
|
button_frame.grid_rowconfigure(1, weight=1)
|
473
478
|
button_frame.grid_columnconfigure(0, weight=1)
|
474
479
|
|
475
|
-
categories_label = spacrLabel(button_frame, text="Categories",
|
480
|
+
categories_label = spacrLabel(button_frame, text="Categories", anchor='center', justify='center', align="center")
|
476
481
|
categories_label.grid(row=0, column=0, pady=10, padx=10)
|
477
|
-
button_scrollable_frame = spacrFrame(button_frame
|
482
|
+
button_scrollable_frame = spacrFrame(button_frame)
|
478
483
|
button_scrollable_frame.grid(row=1, column=0, sticky="nsew")
|
479
484
|
|
485
|
+
widgets = [categories_label, button_scrollable_frame.scrollable_frame]
|
486
|
+
|
480
487
|
btn_col = 0
|
481
488
|
btn_row = 1
|
482
|
-
|
489
|
+
|
483
490
|
if run:
|
484
|
-
run_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Run", command=lambda: start_process(q, fig_queue, settings_type)
|
491
|
+
run_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Run", command=lambda: start_process(q, fig_queue, settings_type))
|
485
492
|
run_button.grid(row=btn_row, column=btn_col, pady=5, padx=5, sticky='ew')
|
493
|
+
widgets.append(run_button)
|
486
494
|
btn_row += 1
|
487
495
|
|
488
496
|
if abort and settings_type in ['mask', 'measure', 'classify', 'sequencing', 'umap']:
|
489
|
-
abort_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Abort", command=initiate_abort
|
497
|
+
abort_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Abort", command=initiate_abort)
|
490
498
|
abort_button.grid(row=btn_row, column=btn_col, pady=5, padx=5, sticky='ew')
|
499
|
+
widgets.append(abort_button)
|
491
500
|
btn_row += 1
|
492
501
|
|
493
502
|
if download and settings_type in ['mask']:
|
494
|
-
download_dataset_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Download", command=download_hug_dataset
|
503
|
+
download_dataset_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Download", command=download_hug_dataset)
|
495
504
|
download_dataset_button.grid(row=btn_row, column=btn_col, pady=5, padx=5, sticky='ew')
|
505
|
+
widgets.append(download_dataset_button)
|
496
506
|
btn_row += 1
|
497
507
|
|
498
508
|
if import_btn:
|
499
|
-
import_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Import", command=lambda: import_settings(settings_type)
|
509
|
+
import_button = spacrButton(button_scrollable_frame.scrollable_frame, text="Import", command=lambda: import_settings(settings_type))
|
500
510
|
import_button.grid(row=btn_row, column=btn_col, pady=5, padx=5, sticky='ew')
|
511
|
+
widgets.append(import_button)
|
501
512
|
|
502
|
-
# Call toggle_settings after vars_dict is initialized
|
503
513
|
if vars_dict is not None:
|
504
514
|
toggle_settings(button_scrollable_frame)
|
505
515
|
|
506
|
-
|
507
|
-
description_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
|
516
|
+
description_frame = tk.Frame(horizontal_container)
|
508
517
|
horizontal_container.add(description_frame, stretch="always", sticky="nsew")
|
509
|
-
description_frame.grid_columnconfigure(0, weight=1)
|
510
|
-
description_label = tk.Label(description_frame, text="Module Description",
|
511
|
-
description_label.grid(row=0, column=0, pady=50, padx=20, sticky='nsew')
|
518
|
+
description_frame.grid_columnconfigure(0, weight=1)
|
519
|
+
description_label = tk.Label(description_frame, text="Module Description", anchor='nw', justify='left', wraplength=width - 50)
|
520
|
+
description_label.grid(row=0, column=0, pady=50, padx=20, sticky='nsew')
|
512
521
|
description_text = descriptions.get(settings_type, "No description available for this module.")
|
513
522
|
description_label.config(text=description_text)
|
514
523
|
|
515
|
-
|
524
|
+
containers = [button_frame, description_frame]
|
525
|
+
widgets.extend([description_label])
|
526
|
+
|
527
|
+
style = ttk.Style(horizontal_container)
|
528
|
+
_ = set_dark_style(style, containers=containers, widgets=widgets)
|
529
|
+
|
530
|
+
return button_frame, button_scrollable_frame, description_frame, description_label
|
516
531
|
|
517
532
|
def hide_all_settings(vars_dict, categories):
|
518
533
|
"""
|
@@ -561,7 +576,6 @@ def toggle_settings(button_scrollable_frame):
|
|
561
576
|
def on_category_select(selected_category):
|
562
577
|
if selected_category == "Select Category":
|
563
578
|
return
|
564
|
-
#print(f"Selected category: {selected_category}")
|
565
579
|
if selected_category in categories:
|
566
580
|
toggle_category(categories[selected_category])
|
567
581
|
if selected_category in active_categories:
|
@@ -569,7 +583,7 @@ def toggle_settings(button_scrollable_frame):
|
|
569
583
|
else:
|
570
584
|
active_categories.add(selected_category)
|
571
585
|
category_dropdown.update_styles(active_categories)
|
572
|
-
category_var.set("Select Category")
|
586
|
+
category_var.set("Select Category")
|
573
587
|
|
574
588
|
category_var = tk.StringVar()
|
575
589
|
non_empty_categories = [category for category, settings in categories.items() if any(setting in vars_dict for setting in settings)]
|
@@ -627,24 +641,29 @@ def set_globals(q_var, console_output_var, parent_frame_var, vars_dict_var, canv
|
|
627
641
|
progress_label = progress_label_var
|
628
642
|
fig_queue = fig_queue_var
|
629
643
|
|
644
|
+
def create_containers(parent_frame):
|
645
|
+
vertical_container = tk.PanedWindow(parent_frame, orient=tk.VERTICAL)
|
646
|
+
horizontal_container = tk.PanedWindow(vertical_container, orient=tk.HORIZONTAL)
|
647
|
+
settings_frame = tk.Frame(horizontal_container)
|
648
|
+
return vertical_container, horizontal_container, settings_frame
|
649
|
+
|
630
650
|
def setup_frame(parent_frame):
|
631
651
|
style = ttk.Style(parent_frame)
|
632
|
-
|
652
|
+
vertical_container, horizontal_container, settings_frame = create_containers(parent_frame)
|
653
|
+
containers = [vertical_container, horizontal_container, settings_frame]
|
654
|
+
|
655
|
+
set_dark_style(style, parent_frame, containers)
|
633
656
|
set_default_font(parent_frame, font_name="Helvetica", size=8)
|
634
|
-
|
635
|
-
parent_frame.grid_rowconfigure(0, weight=1)
|
636
|
-
parent_frame.grid_columnconfigure(0, weight=1)
|
637
|
-
vertical_container = tk.PanedWindow(parent_frame, orient=tk.VERTICAL, bg='black')
|
657
|
+
|
638
658
|
vertical_container.grid(row=0, column=0, sticky=tk.NSEW)
|
639
|
-
horizontal_container = tk.PanedWindow(vertical_container, orient=tk.HORIZONTAL, bg='black')
|
640
659
|
vertical_container.add(horizontal_container, stretch="always")
|
641
660
|
horizontal_container.grid_columnconfigure(0, weight=1)
|
642
661
|
horizontal_container.grid_columnconfigure(1, weight=1)
|
643
|
-
settings_frame = tk.Frame(horizontal_container, bg='black')
|
644
662
|
settings_frame.grid_rowconfigure(0, weight=0)
|
645
663
|
settings_frame.grid_rowconfigure(1, weight=1)
|
646
664
|
settings_frame.grid_columnconfigure(0, weight=1)
|
647
665
|
horizontal_container.add(settings_frame, stretch="always", sticky="nsew")
|
666
|
+
|
648
667
|
return parent_frame, vertical_container, horizontal_container
|
649
668
|
|
650
669
|
def initiate_root(parent, settings_type='mask'):
|
spacr/gui_elements.py
CHANGED
@@ -14,23 +14,97 @@ from collections import deque
|
|
14
14
|
from skimage.draw import polygon, line
|
15
15
|
from skimage.transform import resize
|
16
16
|
from scipy.ndimage import binary_fill_holes, label
|
17
|
+
from tkinter import ttk, scrolledtext
|
18
|
+
|
19
|
+
def set_dark_style(style, parent_frame=None, containers=None, widgets=None, font_family="Arial", font_size=12, bg_color='black', fg_color='white', active_color='teal', inactive_color='gray'):
|
20
|
+
|
21
|
+
if active_color == 'teal':
|
22
|
+
active_color = '#008080'
|
23
|
+
if inactive_color == 'gray':
|
24
|
+
inactive_color = '#555555'
|
25
|
+
if bg_color == 'black':
|
26
|
+
bg_color = '#000000'
|
27
|
+
if fg_color == 'white':
|
28
|
+
fg_color = '#ffffff'
|
29
|
+
|
30
|
+
font_style = tkFont.Font(family=font_family, size=font_size)
|
31
|
+
style.configure('TEntry', padding='5 5 5 5', borderwidth=1, relief='solid', fieldbackground=bg_color, foreground=fg_color, font=font_style)
|
32
|
+
style.configure('TCombobox', fieldbackground=bg_color, background=bg_color, foreground=fg_color, selectbackground=bg_color, selectforeground=fg_color, font=font_style)
|
33
|
+
style.map('TCombobox', fieldbackground=[('readonly', bg_color)], foreground=[('readonly', fg_color)], selectbackground=[('readonly', bg_color)], selectforeground=[('readonly', fg_color)])
|
34
|
+
style.configure('Custom.TButton', background=bg_color, foreground=fg_color, bordercolor=fg_color, focusthickness=3, focuscolor=fg_color, font=(font_family, font_size))
|
35
|
+
style.map('Custom.TButton', background=[('active', active_color), ('!active', bg_color)], foreground=[('active', fg_color), ('!active', fg_color)], bordercolor=[('active', fg_color), ('!active', fg_color)])
|
36
|
+
style.configure('Custom.TLabel', padding='5 5 5 5', borderwidth=1, relief='flat', background=bg_color, foreground=fg_color, font=font_style)
|
37
|
+
style.configure('Spacr.TCheckbutton', background=bg_color, foreground=fg_color, indicatoron=False, relief='flat', font="15")
|
38
|
+
style.map('Spacr.TCheckbutton', background=[('selected', bg_color), ('active', bg_color)], foreground=[('selected', fg_color), ('active', fg_color)])
|
39
|
+
style.configure('TLabel', background=bg_color, foreground=fg_color, font=font_style)
|
40
|
+
style.configure('TFrame', background=bg_color)
|
41
|
+
style.configure('TPanedwindow', background=bg_color)
|
42
|
+
style.configure('TNotebook', background=bg_color, tabmargins=[2, 5, 2, 0])
|
43
|
+
style.configure('TNotebook.Tab', background=bg_color, foreground=fg_color, padding=[5, 5], font=font_style)
|
44
|
+
style.map('TNotebook.Tab', background=[('selected', active_color), ('active', active_color)], foreground=[('selected', fg_color), ('active', fg_color)])
|
45
|
+
style.configure('TButton', background=bg_color, foreground=fg_color, padding='5 5 5 5', font=font_style)
|
46
|
+
style.map('TButton', background=[('active', active_color), ('disabled', inactive_color)])
|
47
|
+
style.configure('Vertical.TScrollbar', background=bg_color, troughcolor=bg_color, bordercolor=bg_color)
|
48
|
+
style.configure('Horizontal.TScrollbar', background=bg_color, troughcolor=bg_color, bordercolor=bg_color)
|
49
|
+
style.configure('Custom.TLabelFrame', font=(font_family, font_size, 'bold'), background=bg_color, foreground='white', relief='solid', borderwidth=1)
|
50
|
+
style.configure('Custom.TLabelFrame.Label', background=bg_color, foreground='white', font=(font_family, font_size, 'bold'))
|
51
|
+
|
52
|
+
if parent_frame:
|
53
|
+
parent_frame.configure(bg=bg_color)
|
54
|
+
parent_frame.grid_rowconfigure(0, weight=1)
|
55
|
+
parent_frame.grid_columnconfigure(0, weight=1)
|
56
|
+
|
57
|
+
if containers:
|
58
|
+
for container in containers:
|
59
|
+
if isinstance(container, ttk.Frame):
|
60
|
+
container_style = ttk.Style()
|
61
|
+
container_style.configure(f'{container.winfo_class()}.TFrame', background=bg_color)
|
62
|
+
container.configure(style=f'{container.winfo_class()}.TFrame')
|
63
|
+
else:
|
64
|
+
container.configure(bg=bg_color)
|
65
|
+
|
66
|
+
if widgets:
|
67
|
+
for widget in widgets:
|
68
|
+
if isinstance(widget, (tk.Label, tk.Button, tk.Frame, ttk.LabelFrame, tk.Canvas)):
|
69
|
+
widget.configure(bg=bg_color)
|
70
|
+
if isinstance(widget, (tk.Label, tk.Button)):
|
71
|
+
widget.configure(fg=fg_color, font=(font_family, font_size))
|
72
|
+
if isinstance(widget, scrolledtext.ScrolledText):
|
73
|
+
widget.configure(bg=bg_color, fg=fg_color, insertbackground=fg_color)
|
74
|
+
if isinstance(widget, tk.OptionMenu):
|
75
|
+
widget.configure(bg=bg_color, fg=fg_color, font=(font_family, font_size))
|
76
|
+
menu = widget['menu']
|
77
|
+
menu.configure(bg=bg_color, fg=fg_color, font=(font_family, font_size))
|
78
|
+
|
79
|
+
return {'font_family':font_family, 'font_size':font_size, 'bg_color':bg_color, 'fg_color':fg_color, 'active_color':active_color, 'inactive_color':inactive_color}
|
80
|
+
|
81
|
+
def set_default_font(root, font_name="Arial", size=12):
|
82
|
+
default_font = (font_name, size)
|
83
|
+
root.option_add("*Font", default_font)
|
84
|
+
root.option_add("*TButton.Font", default_font)
|
85
|
+
root.option_add("*TLabel.Font", default_font)
|
86
|
+
root.option_add("*TEntry.Font", default_font)
|
17
87
|
|
18
88
|
class spacrDropdownMenu(tk.OptionMenu):
|
19
89
|
def __init__(self, parent, variable, options, command=None, **kwargs):
|
20
90
|
self.variable = variable
|
21
91
|
self.variable.set("Select Category")
|
22
92
|
super().__init__(parent, self.variable, *options, command=command, **kwargs)
|
23
|
-
self.
|
93
|
+
self.update_styles()
|
94
|
+
|
95
|
+
def update_styles(self, active_categories=None):
|
96
|
+
style = ttk.Style()
|
97
|
+
style_out = set_dark_style(style, widgets=[self])
|
24
98
|
self.menu = self['menu']
|
25
|
-
|
99
|
+
style_out = set_dark_style(style, widgets=[self.menu])
|
26
100
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
101
|
+
if active_categories is not None:
|
102
|
+
for idx in range(self.menu.index("end") + 1):
|
103
|
+
option = self.menu.entrycget(idx, "label")
|
104
|
+
if option in active_categories:
|
105
|
+
self.menu.entryconfig(idx, background=style_out['active_color'], foreground=style_out['fg_color'])
|
106
|
+
else:
|
107
|
+
self.menu.entryconfig(idx, background=style_out['bg_color'], foreground=style_out['fg_color'])
|
34
108
|
|
35
109
|
class spacrCheckbutton(ttk.Checkbutton):
|
36
110
|
def __init__(self, parent, text="", variable=None, command=None, *args, **kwargs):
|
@@ -39,6 +113,9 @@ class spacrCheckbutton(ttk.Checkbutton):
|
|
39
113
|
self.variable = variable if variable else tk.BooleanVar()
|
40
114
|
self.command = command
|
41
115
|
self.configure(text=self.text, variable=self.variable, command=self.command, style='Spacr.TCheckbutton')
|
116
|
+
style = ttk.Style()
|
117
|
+
_ = set_dark_style(style, widgets=[self])
|
118
|
+
|
42
119
|
|
43
120
|
class spacrFrame(ttk.Frame):
|
44
121
|
def __init__(self, container, width=None, *args, bg='black', **kwargs):
|
@@ -65,25 +142,25 @@ class spacrFrame(ttk.Frame):
|
|
65
142
|
self.grid_columnconfigure(0, weight=1)
|
66
143
|
self.grid_columnconfigure(1, weight=0)
|
67
144
|
|
68
|
-
|
69
|
-
|
145
|
+
style = ttk.Style()
|
146
|
+
_ = set_dark_style(style, containers=[self], widgets=[canvas, scrollbar, self.scrollable_frame])
|
70
147
|
|
71
148
|
class spacrLabel(tk.Frame):
|
72
149
|
def __init__(self, parent, text="", font=None, style=None, align="right", **kwargs):
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
super().__init__(parent, **kwargs)
|
150
|
+
valid_kwargs = {k: v for k, v in kwargs.items() if k not in ['foreground', 'background', 'font', 'anchor', 'justify', 'wraplength']}
|
151
|
+
super().__init__(parent, **valid_kwargs)
|
152
|
+
|
77
153
|
self.text = text
|
78
|
-
self.kwargs = label_kwargs
|
79
154
|
self.align = align
|
80
155
|
screen_height = self.winfo_screenheight()
|
81
156
|
label_height = screen_height // 50
|
82
157
|
label_width = label_height * 10
|
83
|
-
|
158
|
+
style_out = set_dark_style(ttk.Style())
|
159
|
+
|
160
|
+
self.canvas = tk.Canvas(self, width=label_width, height=label_height, highlightthickness=0, bg=style_out['bg_color'])
|
84
161
|
self.canvas.grid(row=0, column=0, sticky="ew")
|
85
162
|
|
86
|
-
self.font_style = font if font else tkFont.Font(family=
|
163
|
+
self.font_style = font if font else tkFont.Font(family=style_out['font_family'], size=style_out['font_size'], weight=tkFont.NORMAL)
|
87
164
|
self.style = style
|
88
165
|
|
89
166
|
if self.align == "center":
|
@@ -95,13 +172,15 @@ class spacrLabel(tk.Frame):
|
|
95
172
|
|
96
173
|
if self.style:
|
97
174
|
ttk_style = ttk.Style()
|
98
|
-
ttk_style.configure(self.style,
|
99
|
-
self.label_text = ttk.Label(self.canvas, text=self.text, style=self.style, anchor=text_anchor
|
175
|
+
ttk_style.configure(self.style, font=self.font_style, background=style_out['bg_color'], foreground=style_out['fg_color'])
|
176
|
+
self.label_text = ttk.Label(self.canvas, text=self.text, style=self.style, anchor=text_anchor)
|
100
177
|
self.label_text.pack(fill=tk.BOTH, expand=True)
|
101
178
|
else:
|
102
179
|
self.label_text = self.canvas.create_text(label_width // 2 if self.align == "center" else label_width - 5,
|
103
|
-
label_height // 2, text=self.text, fill=
|
180
|
+
label_height // 2, text=self.text, fill=style_out['fg_color'],
|
104
181
|
font=self.font_style, anchor=anchor_value, justify=tk.RIGHT)
|
182
|
+
|
183
|
+
_ = set_dark_style(ttk.Style(), containers=[self], widgets=[self.canvas])
|
105
184
|
|
106
185
|
def set_text(self, text):
|
107
186
|
if self.style:
|
@@ -112,22 +191,23 @@ class spacrLabel(tk.Frame):
|
|
112
191
|
class spacrButton(tk.Frame):
|
113
192
|
def __init__(self, parent, text="", command=None, font=None, *args, **kwargs):
|
114
193
|
super().__init__(parent, *args, **kwargs)
|
194
|
+
|
115
195
|
self.text = text
|
116
196
|
self.command = command
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
#print(button_height, button_width)
|
197
|
+
button_height = 50
|
198
|
+
button_width = 140
|
199
|
+
style_out = set_dark_style(ttk.Style())
|
122
200
|
|
123
|
-
#
|
124
|
-
self.canvas = tk.Canvas(self, width=button_width + 4, height=button_height + 4, highlightthickness=0, bg=
|
201
|
+
# Create the canvas first
|
202
|
+
self.canvas = tk.Canvas(self, width=button_width + 4, height=button_height + 4, highlightthickness=0, bg=style_out['bg_color'])
|
125
203
|
self.canvas.grid(row=0, column=0)
|
126
204
|
|
127
|
-
|
205
|
+
# Apply dark style and get color settings
|
206
|
+
color_settings = set_dark_style(ttk.Style(), containers=[self], widgets=[self.canvas])
|
128
207
|
|
129
|
-
self.
|
130
|
-
self.
|
208
|
+
self.button_bg = self.create_rounded_rectangle(2, 2, button_width + 2, button_height + 2, radius=20, fill=color_settings['bg_color'], outline=color_settings['fg_color'])
|
209
|
+
self.font_style = font if font else tkFont.Font(family=color_settings['font_family'], size=color_settings['font_size'], weight=tkFont.NORMAL)
|
210
|
+
self.button_text = self.canvas.create_text((button_width + 4) // 2, (button_height + 4) // 2, text=self.text, fill=color_settings['fg_color'], font=self.font_style)
|
131
211
|
|
132
212
|
self.bind("<Enter>", self.on_enter)
|
133
213
|
self.bind("<Leave>", self.on_leave)
|
@@ -136,11 +216,15 @@ class spacrButton(tk.Frame):
|
|
136
216
|
self.canvas.bind("<Leave>", self.on_leave)
|
137
217
|
self.canvas.bind("<Button-1>", self.on_click)
|
138
218
|
|
219
|
+
self.bg_color = color_settings['bg_color']
|
220
|
+
self.active_color = color_settings['active_color']
|
221
|
+
self.fg_color = color_settings['fg_color']
|
222
|
+
|
139
223
|
def on_enter(self, event=None):
|
140
|
-
self.canvas.itemconfig(self.button_bg, fill=
|
224
|
+
self.canvas.itemconfig(self.button_bg, fill=self.active_color)
|
141
225
|
|
142
226
|
def on_leave(self, event=None):
|
143
|
-
self.canvas.itemconfig(self.button_bg, fill=
|
227
|
+
self.canvas.itemconfig(self.button_bg, fill=self.bg_color)
|
144
228
|
|
145
229
|
def on_click(self, event=None):
|
146
230
|
if self.command:
|
@@ -177,17 +261,20 @@ class spacrSwitch(ttk.Frame):
|
|
177
261
|
self.text = text
|
178
262
|
self.variable = variable if variable else tk.BooleanVar()
|
179
263
|
self.command = command
|
180
|
-
self.canvas = tk.Canvas(self, width=40, height=20, highlightthickness=0, bd=0
|
264
|
+
self.canvas = tk.Canvas(self, width=40, height=20, highlightthickness=0, bd=0)
|
181
265
|
self.canvas.grid(row=0, column=1, padx=(10, 0))
|
182
266
|
self.switch_bg = self.create_rounded_rectangle(2, 2, 38, 18, radius=9, outline="", fill="#fff")
|
183
|
-
self.switch = self.canvas.create_oval(4, 4, 16, 16, outline="", fill="#800080")
|
184
|
-
self.label = spacrLabel(self, text=self.text
|
267
|
+
self.switch = self.canvas.create_oval(4, 4, 16, 16, outline="", fill="#800080")
|
268
|
+
self.label = spacrLabel(self, text=self.text)
|
185
269
|
self.label.grid(row=0, column=0, padx=(0, 10))
|
186
270
|
self.bind("<Button-1>", self.toggle)
|
187
271
|
self.canvas.bind("<Button-1>", self.toggle)
|
188
272
|
self.label.bind("<Button-1>", self.toggle)
|
189
273
|
self.update_switch()
|
190
274
|
|
275
|
+
style = ttk.Style()
|
276
|
+
_ = set_dark_style(style, containers=[self], widgets=[self.canvas, self.label])
|
277
|
+
|
191
278
|
def toggle(self, event=None):
|
192
279
|
self.variable.set(not self.variable.get())
|
193
280
|
self.animate_switch()
|
@@ -196,19 +283,19 @@ class spacrSwitch(ttk.Frame):
|
|
196
283
|
|
197
284
|
def update_switch(self):
|
198
285
|
if self.variable.get():
|
199
|
-
self.canvas.itemconfig(self.switch, fill="#008080")
|
200
|
-
self.canvas.coords(self.switch, 24, 4, 36, 16)
|
286
|
+
self.canvas.itemconfig(self.switch, fill="#008080")
|
287
|
+
self.canvas.coords(self.switch, 24, 4, 36, 16)
|
201
288
|
else:
|
202
|
-
self.canvas.itemconfig(self.switch, fill="#800080")
|
203
|
-
self.canvas.coords(self.switch, 4, 4, 16, 16)
|
289
|
+
self.canvas.itemconfig(self.switch, fill="#800080")
|
290
|
+
self.canvas.coords(self.switch, 4, 4, 16, 16)
|
204
291
|
|
205
292
|
def animate_switch(self):
|
206
293
|
if self.variable.get():
|
207
294
|
start_x, end_x = 4, 24
|
208
|
-
final_color = "#008080"
|
295
|
+
final_color = "#008080"
|
209
296
|
else:
|
210
297
|
start_x, end_x = 24, 4
|
211
|
-
final_color = "#800080"
|
298
|
+
final_color = "#800080"
|
212
299
|
|
213
300
|
self.animate_movement(start_x, end_x, final_color)
|
214
301
|
|
@@ -217,7 +304,7 @@ class spacrSwitch(ttk.Frame):
|
|
217
304
|
for i in range(start_x, end_x, step):
|
218
305
|
self.canvas.coords(self.switch, i, 4, i + 12, 16)
|
219
306
|
self.canvas.update()
|
220
|
-
self.after(10)
|
307
|
+
self.after(10)
|
221
308
|
self.canvas.itemconfig(self.switch, fill=final_color)
|
222
309
|
|
223
310
|
def get(self):
|
@@ -227,7 +314,7 @@ class spacrSwitch(ttk.Frame):
|
|
227
314
|
self.variable.set(value)
|
228
315
|
self.update_switch()
|
229
316
|
|
230
|
-
def create_rounded_rectangle(self, x1, y1, x2, y2, radius=9, **kwargs):
|
317
|
+
def create_rounded_rectangle(self, x1, y1, x2, y2, radius=9, **kwargs):
|
231
318
|
points = [x1 + radius, y1,
|
232
319
|
x1 + radius, y1,
|
233
320
|
x2 - radius, y1,
|
@@ -265,17 +352,18 @@ class spacrToolTip:
|
|
265
352
|
self.tooltip_window = tk.Toplevel(self.widget)
|
266
353
|
self.tooltip_window.wm_overrideredirect(True)
|
267
354
|
self.tooltip_window.wm_geometry(f"+{x}+{y}")
|
268
|
-
self.tooltip_window.
|
269
|
-
label = tk.Label(self.tooltip_window, text=self.text, background="#333333", foreground="white", relief='flat', borderwidth=0)
|
355
|
+
label = tk.Label(self.tooltip_window, text=self.text, relief='flat', borderwidth=0)
|
270
356
|
label.grid(row=0, column=0, padx=5, pady=5)
|
271
357
|
|
358
|
+
style = ttk.Style()
|
359
|
+
_ = set_dark_style(style, containers=[self.tooltip_window], widgets=[label])
|
360
|
+
|
272
361
|
def hide_tooltip(self, event):
|
273
362
|
if self.tooltip_window:
|
274
363
|
self.tooltip_window.destroy()
|
275
364
|
self.tooltip_window = None
|
276
365
|
|
277
366
|
class modify_masks:
|
278
|
-
|
279
367
|
def __init__(self, root, folder_path, scale_factor):
|
280
368
|
self.root = root
|
281
369
|
self.folder_path = folder_path
|
@@ -1465,35 +1553,4 @@ def create_menu_bar(root):
|
|
1465
1553
|
app_menu.add_separator()
|
1466
1554
|
app_menu.add_command(label="Exit", command=root.quit)
|
1467
1555
|
# Configure the menu for the root window
|
1468
|
-
root.config(menu=menu_bar)
|
1469
|
-
|
1470
|
-
|
1471
|
-
def set_dark_style(style):
|
1472
|
-
font_style = tkFont.Font(family="Helvetica", size=24)
|
1473
|
-
style.configure('TEntry', padding='5 5 5 5', borderwidth=1, relief='solid', fieldbackground='black', foreground='#ffffff', font=font_style)
|
1474
|
-
style.configure('TCombobox', fieldbackground='black', background='black', foreground='#ffffff', selectbackground='black', selectforeground='#ffffff', font=font_style)
|
1475
|
-
style.map('TCombobox', fieldbackground=[('readonly', 'black')], foreground=[('readonly', '#ffffff')], selectbackground=[('readonly', 'black')], selectforeground=[('readonly', '#ffffff')])
|
1476
|
-
style.configure('Custom.TButton', background='black', foreground='white', bordercolor='white', focusthickness=3, focuscolor='white', font=('Helvetica', 12))
|
1477
|
-
style.map('Custom.TButton', background=[('active', 'teal'), ('!active', 'black')], foreground=[('active', 'white'), ('!active', 'white')], bordercolor=[('active', 'white'), ('!active', 'white')])
|
1478
|
-
style.configure('Custom.TLabel', padding='5 5 5 5', borderwidth=1, relief='flat', background='black', foreground='#ffffff', font=font_style)
|
1479
|
-
style.configure('Spacr.TCheckbutton', background='black', foreground='#ffffff', indicatoron=False, relief='flat', font="15")
|
1480
|
-
style.map('Spacr.TCheckbutton', background=[('selected', 'black'), ('active', 'black')], foreground=[('selected', '#ffffff'), ('active', '#ffffff')])
|
1481
|
-
style.configure('TLabel', background='black', foreground='#ffffff', font=font_style)
|
1482
|
-
style.configure('TFrame', background='black')
|
1483
|
-
style.configure('TPanedwindow', background='black')
|
1484
|
-
style.configure('TNotebook', background='black', tabmargins=[2, 5, 2, 0])
|
1485
|
-
style.configure('TNotebook.Tab', background='black', foreground='#ffffff', padding=[5, 5], font=font_style)
|
1486
|
-
style.map('TNotebook.Tab', background=[('selected', '#555555'), ('active', '#555555')], foreground=[('selected', '#ffffff'), ('active', '#ffffff')])
|
1487
|
-
style.configure('TButton', background='black', foreground='#ffffff', padding='5 5 5 5', font=font_style)
|
1488
|
-
style.map('TButton', background=[('active', '#555555'), ('disabled', '#333333')])
|
1489
|
-
style.configure('Vertical.TScrollbar', background='black', troughcolor='black', bordercolor='black')
|
1490
|
-
style.configure('Horizontal.TScrollbar', background='black', troughcolor='black', bordercolor='black')
|
1491
|
-
style.configure('Custom.TLabelFrame', font=('Helvetica', 10, 'bold'), background='black', foreground='white', relief='solid', borderwidth=1)
|
1492
|
-
style.configure('Custom.TLabelFrame.Label', background='black', foreground='white', font=('Helvetica', 10, 'bold'))
|
1493
|
-
|
1494
|
-
def set_default_font(root, font_name="Helvetica", size=12):
|
1495
|
-
default_font = (font_name, size)
|
1496
|
-
root.option_add("*Font", default_font)
|
1497
|
-
root.option_add("*TButton.Font", default_font)
|
1498
|
-
root.option_add("*TLabel.Font", default_font)
|
1499
|
-
root.option_add("*TEntry.Font", default_font)
|
1556
|
+
root.config(menu=menu_bar)
|
spacr/test_gui.py
ADDED
File without changes
|
@@ -19,12 +19,12 @@ spacr/deep_spacr.py,sha256=ASBsN4JpHp_3S-91JUsB34IWTjTGPYI7jKV2qZnUR5M,37005
|
|
19
19
|
spacr/foldseek.py,sha256=YIP1d4Ci6CeA9jSyiv-HTDbNmAmcSM9Y_DaOs7wYzLY,33546
|
20
20
|
spacr/get_alfafold_structures.py,sha256=ehx_MQgb12k3hFecP6cYVlm5TLO8iWjgevy8ESyS3cw,3544
|
21
21
|
spacr/graph_learning.py,sha256=1tR-ZxvXE3dBz1Saw7BeVFcrsUFu9OlUZeZVifih9eo,13070
|
22
|
-
spacr/gui.py,sha256=
|
22
|
+
spacr/gui.py,sha256=1zzB3IKhGh7YYfU4p3vuABFLEn3AI2nLbWJ-CnH7LCk,9734
|
23
23
|
spacr/gui_2.py,sha256=ZAI5quQYbhQJ40vK0NCqU_UMSPLkpfeQpomBWUSM0fc,6946
|
24
24
|
spacr/gui_annotate.py,sha256=ugBksLGOHdtOLlEuRyyc59TrkYKu3rDf8JxEgiBSVao,6536
|
25
25
|
spacr/gui_classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
|
26
|
-
spacr/gui_core.py,sha256=
|
27
|
-
spacr/gui_elements.py,sha256=
|
26
|
+
spacr/gui_core.py,sha256=H_d_WVlGdMigAKlvG4xytFy1j8k7_EJDyR__OdSjBws,31846
|
27
|
+
spacr/gui_elements.py,sha256=RzHRN_oXoiOWC8t8mYPH9D2eHT0xx7iyebQxJ4dNOjI,75760
|
28
28
|
spacr/gui_make_masks_app.py,sha256=tl4M4Q2WQgrrwjRBJVevxJxpNowqzPhWkdCOm2UfRbw,45053
|
29
29
|
spacr/gui_make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
|
30
30
|
spacr/gui_mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
|
@@ -46,15 +46,16 @@ spacr/sequencing.py,sha256=fHZRnoMSxmhMdadkei3lUeBdckqFyptWdQyWsDW3aaU,83304
|
|
46
46
|
spacr/settings.py,sha256=VkRJHdzDtfGn_F8sJ5rfK80blZhpy21djxLfQcnlhGA,65665
|
47
47
|
spacr/sim.py,sha256=FveaVgBi3eypO2oVB5Dx-v0CC1Ny7UPfXkJiiRRodAk,71212
|
48
48
|
spacr/sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
|
+
spacr/test_gui.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
50
|
spacr/timelapse.py,sha256=KMYCgHzf9LTZe-lWl5mvH2EjbKRE6OhpwdY13wEumGc,39504
|
50
51
|
spacr/utils.py,sha256=OQ8sSBH6VWx2xP_vh4ILJT71B46DFFhsq-Y6WxYdGhI,186891
|
51
52
|
spacr/version.py,sha256=axH5tnGwtgSnJHb5IDhiu4Zjk5GhLyAEDRe-rnaoFOA,409
|
52
53
|
spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model,sha256=z8BbHWZPRnE9D_BHO0fBREE85c1vkltDs-incs2ytXQ,26566572
|
53
54
|
spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv,sha256=fBAGuL_B8ERVdVizO3BHozTDSbZUh1yFzsYK3wkQN68,420
|
54
55
|
spacr/models/cp/toxo_pv_lumen.CP_model,sha256=2y_CindYhmTvVwBH39SNILF3rI3x9SsRn6qrMxHy3l0,26562451
|
55
|
-
spacr-0.1.
|
56
|
-
spacr-0.1.
|
57
|
-
spacr-0.1.
|
58
|
-
spacr-0.1.
|
59
|
-
spacr-0.1.
|
60
|
-
spacr-0.1.
|
56
|
+
spacr-0.1.85.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
|
57
|
+
spacr-0.1.85.dist-info/METADATA,sha256=uAffhBMl-ibkrdDHadHFtwmw2MrN1cOHxIoLbe_Rpso,5050
|
58
|
+
spacr-0.1.85.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
59
|
+
spacr-0.1.85.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
|
60
|
+
spacr-0.1.85.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
|
61
|
+
spacr-0.1.85.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|