scustomtkinter 0.2.1__tar.gz

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.
Files changed (106) hide show
  1. scustomtkinter-0.2.1/LICENSE +21 -0
  2. scustomtkinter-0.2.1/MANIFEST.in +2 -0
  3. scustomtkinter-0.2.1/PKG-INFO +336 -0
  4. scustomtkinter-0.2.1/README.md +309 -0
  5. scustomtkinter-0.2.1/pyproject.toml +58 -0
  6. scustomtkinter-0.2.1/scustomtkinter/__init__.py +81 -0
  7. scustomtkinter-0.2.1/scustomtkinter/assets/images/error.png +0 -0
  8. scustomtkinter-0.2.1/scustomtkinter/assets/images/info.png +0 -0
  9. scustomtkinter-0.2.1/scustomtkinter/assets/images/warning.png +0 -0
  10. scustomtkinter-0.2.1/scustomtkinter/assets/sCTkThemes.json +1963 -0
  11. scustomtkinter-0.2.1/scustomtkinter/license_morecustomtkinterwidgets.txt +22 -0
  12. scustomtkinter-0.2.1/scustomtkinter/sctk_button_primary.py +366 -0
  13. scustomtkinter-0.2.1/scustomtkinter/sctk_button_secondary.py +354 -0
  14. scustomtkinter-0.2.1/scustomtkinter/sctk_button_tertiary.py +375 -0
  15. scustomtkinter-0.2.1/scustomtkinter/sctk_checkbox.py +270 -0
  16. scustomtkinter-0.2.1/scustomtkinter/sctk_combobox.py +155 -0
  17. scustomtkinter-0.2.1/scustomtkinter/sctk_core.py +15 -0
  18. scustomtkinter-0.2.1/scustomtkinter/sctk_dial.py +1472 -0
  19. scustomtkinter-0.2.1/scustomtkinter/sctk_dialog.py +701 -0
  20. scustomtkinter-0.2.1/scustomtkinter/sctk_dialog_toplevel.py +268 -0
  21. scustomtkinter-0.2.1/scustomtkinter/sctk_entry_primary.py +400 -0
  22. scustomtkinter-0.2.1/scustomtkinter/sctk_entry_secondary.py +342 -0
  23. scustomtkinter-0.2.1/scustomtkinter/sctk_file_explorer.py +879 -0
  24. scustomtkinter-0.2.1/scustomtkinter/sctk_frame.py +210 -0
  25. scustomtkinter-0.2.1/scustomtkinter/sctk_frame_labeled_primary.py +667 -0
  26. scustomtkinter-0.2.1/scustomtkinter/sctk_frame_labeled_secondary.py +598 -0
  27. scustomtkinter-0.2.1/scustomtkinter/sctk_frequency_display.py +636 -0
  28. scustomtkinter-0.2.1/scustomtkinter/sctk_label_primary.py +283 -0
  29. scustomtkinter-0.2.1/scustomtkinter/sctk_label_secondary.py +275 -0
  30. scustomtkinter-0.2.1/scustomtkinter/sctk_label_tertiary.py +278 -0
  31. scustomtkinter-0.2.1/scustomtkinter/sctk_messagebox.py +275 -0
  32. scustomtkinter-0.2.1/scustomtkinter/sctk_notebook.py +1103 -0
  33. scustomtkinter-0.2.1/scustomtkinter/sctk_optionmenu_border_mixin.py +203 -0
  34. scustomtkinter-0.2.1/scustomtkinter/sctk_optionmenu_primary.py +378 -0
  35. scustomtkinter-0.2.1/scustomtkinter/sctk_optionmenu_secondary.py +346 -0
  36. scustomtkinter-0.2.1/scustomtkinter/sctk_path_chooser.py +516 -0
  37. scustomtkinter-0.2.1/scustomtkinter/sctk_progress_bar.py +274 -0
  38. scustomtkinter-0.2.1/scustomtkinter/sctk_radiobutton.py +360 -0
  39. scustomtkinter-0.2.1/scustomtkinter/sctk_scroll_mixin.py +546 -0
  40. scustomtkinter-0.2.1/scustomtkinter/sctk_scrollable_frame.py +795 -0
  41. scustomtkinter-0.2.1/scustomtkinter/sctk_scrollbar.py +313 -0
  42. scustomtkinter-0.2.1/scustomtkinter/sctk_segmentedbutton.py +424 -0
  43. scustomtkinter-0.2.1/scustomtkinter/sctk_selector.py +581 -0
  44. scustomtkinter-0.2.1/scustomtkinter/sctk_separator.py +308 -0
  45. scustomtkinter-0.2.1/scustomtkinter/sctk_slider.py +264 -0
  46. scustomtkinter-0.2.1/scustomtkinter/sctk_smeter.py +405 -0
  47. scustomtkinter-0.2.1/scustomtkinter/sctk_smeter_bar.py +557 -0
  48. scustomtkinter-0.2.1/scustomtkinter/sctk_spinbox.py +664 -0
  49. scustomtkinter-0.2.1/scustomtkinter/sctk_switch.py +463 -0
  50. scustomtkinter-0.2.1/scustomtkinter/sctk_tableview.py +869 -0
  51. scustomtkinter-0.2.1/scustomtkinter/sctk_tabview.py +409 -0
  52. scustomtkinter-0.2.1/scustomtkinter/sctk_textbox_primary.py +291 -0
  53. scustomtkinter-0.2.1/scustomtkinter/sctk_textbox_secondary.py +225 -0
  54. scustomtkinter-0.2.1/scustomtkinter/sctk_toplevel.py +153 -0
  55. scustomtkinter-0.2.1/scustomtkinter/themeable_widget.py +938 -0
  56. scustomtkinter-0.2.1/scustomtkinter.egg-info/PKG-INFO +336 -0
  57. scustomtkinter-0.2.1/scustomtkinter.egg-info/SOURCES.txt +104 -0
  58. scustomtkinter-0.2.1/scustomtkinter.egg-info/dependency_links.txt +1 -0
  59. scustomtkinter-0.2.1/scustomtkinter.egg-info/entry_points.txt +2 -0
  60. scustomtkinter-0.2.1/scustomtkinter.egg-info/requires.txt +6 -0
  61. scustomtkinter-0.2.1/scustomtkinter.egg-info/top_level.txt +2 -0
  62. scustomtkinter-0.2.1/scustomtkinter_pygubu/__init__.py +1 -0
  63. scustomtkinter-0.2.1/scustomtkinter_pygubu/designer/__init__.py +0 -0
  64. scustomtkinter-0.2.1/scustomtkinter_pygubu/designer/plugin.py +1854 -0
  65. scustomtkinter-0.2.1/scustomtkinter_pygubu/designer/properties.py +247 -0
  66. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkButtonPrimarybo.py +46 -0
  67. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkButtonSecondarybo.py +45 -0
  68. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkButtonTertiarybo.py +44 -0
  69. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkCheckBoxbo.py +45 -0
  70. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkComboBoxbo.py +45 -0
  71. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkCorebo.py +120 -0
  72. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkDialbo.py +371 -0
  73. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkDialogbo.py +397 -0
  74. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkEntryPrimarybo.py +100 -0
  75. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkEntrySecondarybo.py +98 -0
  76. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkFileExplorerbo.py +189 -0
  77. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkFrameLabeledPrimarybo.py +69 -0
  78. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkFrameLabeledSecondarybo.py +71 -0
  79. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkFramebo.py +46 -0
  80. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkFrequencyDisplaybo.py +175 -0
  81. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkLabelPrimarybo.py +45 -0
  82. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkLabelSecondarybo.py +44 -0
  83. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkLabelTertiarybo.py +45 -0
  84. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkNotebookbo.py +392 -0
  85. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkOptionMenuPrimarybo.py +45 -0
  86. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkOptionMenuSecondarybo.py +39 -0
  87. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkPathChooserbo.py +204 -0
  88. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkProgressBarbo.py +45 -0
  89. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkRadioButtonbo.py +45 -0
  90. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSMeterBarbo.py +153 -0
  91. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSMeterbo.py +101 -0
  92. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkScrollableFramebo.py +66 -0
  93. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkScrollbarbo.py +48 -0
  94. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSegmentedButtonbo.py +47 -0
  95. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSelectorbo.py +167 -0
  96. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSeparatorbo.py +141 -0
  97. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSliderbo.py +45 -0
  98. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSpinboxbo.py +200 -0
  99. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkSwitchbo.py +45 -0
  100. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkTableviewbo.py +188 -0
  101. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkTabviewbo.py +226 -0
  102. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkTextboxPrimarybo.py +45 -0
  103. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkTextboxSecondarybo.py +45 -0
  104. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkToplevelbo.py +55 -0
  105. scustomtkinter-0.2.1/scustomtkinter_pygubu/sCTkWidgetSetForPygubuDesigner.py +141 -0
  106. scustomtkinter-0.2.1/setup.cfg +4 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mark J. Hatch (AJ6CU)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ recursive-include scustomtkinter/assets *.json
2
+ recursive-include scustomtkinter/assets/images *.png
@@ -0,0 +1,336 @@
1
+ Metadata-Version: 2.4
2
+ Name: scustomtkinter
3
+ Version: 0.2.1
4
+ Summary: Themeable widgets for CustomTkinter -- tiers of buttons, labels and entries, dials, meters, tables and file choosers -- with Pygubu Designer support.
5
+ Author: Mark J. Hatch (AJ6CU)
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/AJ6CU/sCustomTkinter
8
+ Project-URL: Documentation, https://github.com/AJ6CU/sCustomTkinter/tree/main/docs
9
+ Project-URL: Issues, https://github.com/AJ6CU/sCustomTkinter/issues
10
+ Keywords: customtkinter,tkinter,gui,widgets,themes,pygubu
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Topic :: Software Development :: User Interfaces
16
+ Classifier: Topic :: Software Development :: Widget Sets
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ License-File: scustomtkinter/license_morecustomtkinterwidgets.txt
21
+ Requires-Dist: customtkinter>=6.0
22
+ Requires-Dist: Pillow
23
+ Provides-Extra: designer
24
+ Requires-Dist: pygubu; extra == "designer"
25
+ Requires-Dist: pygubu-designer; extra == "designer"
26
+ Dynamic: license-file
27
+
28
+ # sCustomTkinter
29
+
30
+
31
+ A high-performance, theme-adaptive, and encapsulated widget framework engineered to support user interfaces with multiple designs for each widget. Not all Buttons (or for that matter Labels, Menus, etc.) should look the same in a well thought out UX. Important ones should catch your attention, while the less important fade into the background until needed. For example, `sCustomTkinter` starts you off with 3 different level of Buttons, that you can individually tailor to your design theme to help create consistency across your whole UX.
32
+
33
+ This project is a set of subclasses (hence the "s" prefix) of Tom Schimansky's [CustomTkinter](https://customtkinter.tomschimansky.com/) which he has generously made available to the community under the MIT License. Without his work, this would not have been made possible.
34
+
35
+ The vast majority of the widgets provided by `sCustomTkinter` are based on the ones originally provided with `CustomTkinter`. However, there are several additions including knobs, analog meter displays, file choosers, table, selectors, and spinboxes that have been added primarily because I needed them for my own project and decided to share. In addition, the library has been designed from the start to integrated with Alejandro Autalan wonderful GUI Builder for python, [Pygubu-Designer](https://github.com/alejandroautalan/pygubu-designer). I have used his software extensively in other projects (visit other areas in my Github) and it has saved me a lot of time and effort.
36
+
37
+ However, this design has been architected to allow you to add your own widgets, or subclass mine for your purposes. The key to the themes is sCTkThemes.json. Don't like my color choices (understandable as I am a little red/brown color blind...) , copy this file from Github, modify it and put it in your applications directory. It will be found before the common one in scustomtkinter/assets. The format of this file, is very similar to the original Themes definition file of `CustomTkinter` (it has additions that would give the standard `CustomTkinter` theme processor problems in addition to the new widgets that might cause a few runtime exceptions).
38
+
39
+ Want to add a widget? Create it, add `ThemeableWidget` as a second base class, and see [dev/docs/Developing.md](https://github.com/AJ6CU/sCustomTkinter/blob/main/dev/docs/Developing.md) — it covers the theme contract, the traps in forwarding properties to the underlying `CustomTkinter` widget, and the bugs that have turned up repeatedly in this library so you can avoid repeating them.
40
+
41
+
42
+
43
+ ## Table of Contents
44
+ * [Quick-Start](#quick-start)
45
+ * [Theming](#theming)
46
+ * [Scrolling](#scrolling)
47
+ * [List Properties](#list-properties)
48
+ * [Designer Hints](#designer-hints)
49
+ * [Comprehensive Component Catalog](#comprehensive-component-catalog)
50
+ * [Repository Directory Structure](#repository-directory-structure)
51
+ * [License](#license)
52
+
53
+ ---
54
+
55
+ ## Quick-Start
56
+
57
+ ### sCustomTkinter Installation
58
+
59
+ Install it from PyPI:
60
+
61
+ ```bash
62
+ pip install scustomtkinter
63
+ ```
64
+
65
+ With the Pygubu Designer plugin and the Designer itself:
66
+
67
+ ```bash
68
+ pip install "scustomtkinter[designer]"
69
+ ```
70
+
71
+ In PyCharm, search for `scustomtkinter` in the Python Packages window.
72
+
73
+ The latest development version, ahead of the last release, comes straight from GitHub (this needs git):
74
+
75
+ ```bash
76
+ pip install git+https://github.com/aj6cu/sCustomTkinter/
77
+ ```
78
+
79
+ Tkinter itself comes with Python, not from pip. The python.org installers include it; with Homebrew's Python run `brew install python-tk@3.x` (your version), and on Debian or Ubuntu `sudo apt install python3-tk`.
80
+
81
+
82
+ ### Library Test Script
83
+
84
+
85
+ You can use the following simple program to test that the installation worked:
86
+
87
+ ```python
88
+ from scustomtkinter import sCTk, sCTkFrame, sCTkButtonPrimary
89
+
90
+ root = sCTk()
91
+ root.geometry("600x450")
92
+ root.title("Station Command Console")
93
+
94
+ panel = sCTkFrame(root, border_width=2)
95
+ panel.pack(padx=20, pady=20, fill="both", expand=True)
96
+
97
+ btn = sCTkButtonPrimary(panel, text="Transmit Call", command=lambda: print("TX ACTIVE"))
98
+ btn.pack(pady=10)
99
+
100
+ root.mainloop()
101
+ ```
102
+
103
+ ### Pygubu-Designer Installation
104
+
105
+ 1. Install Pygubu-Designer into the same virtual environment: `pip install "scustomtkinter[designer]"` installs it with the plugin's needs, or `pip install pygubu-designer` beside an existing install.
106
+ 2. Start Pygubu-Designer, you will see the sCustomTkinter widgets at the bottom of the Components on the left.
107
+ 3. Add a sCTK root or a sCTkToplevel and go!
108
+
109
+ ## Theming
110
+
111
+ Every colour and font in this library comes from one file, `sCTkThemes.json`. No widget hardcodes a colour. To change the palette, copy that file into your application's directory and edit it — the local copy is found before the bundled one.
112
+
113
+ **Copy the whole file.** The local file replaces the bundled one entirely; there is no merging. A block you delete is not filled in from the library defaults — the widget will fail to construct instead. That's deliberate: widgets validate their required keys and raise a `KeyError` naming exactly what's missing, because the alternative (silently substituting a plausible colour) hid real bugs for a long time.
114
+
115
+ The format extends CustomTkinter's own theme file with per-state colour maps and additional widget blocks. Colours are `[light_mode, dark_mode]` pairs and follow appearance-mode switches automatically.
116
+
117
+ **See [Theming](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/src/Theming.md)** for the full reference, including state maps, runtime overrides, and the several ways a hand-edited JSON file can break.
118
+
119
+ ---
120
+
121
+ ## Scrolling
122
+
123
+ Wheel and trackpad handling is shared by every scrolling widget, so it behaves consistently and is tuned in one place. Windows, Linux, and macOS are each handled natively, including macOS's separate high-precision trackpad event stream.
124
+
125
+ For most cases use `sCTkScrollableFrame`, which manages its own scrollbar. Use `sCTkScrollArea` with a separate `sCTkScrollbar` when you need the bar somewhere the built-in one can't go.
126
+
127
+ Scroll speed is controlled by three constants that can be changed globally or per widget. If a wheel click moves too far or too little — particularly on macOS, where a wheel mouse and a Magic Mouse report wildly different values — that's what to adjust.
128
+
129
+ **See [Scrolling](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/src/Scrolling.md)** for the widget comparison, the tuning constants, and how disabling interacts with scroll state.
130
+
131
+ ---
132
+
133
+ ## List Properties
134
+
135
+ Several widgets take a list of strings — a table's column headings, a menu's items, a dial's labels. They all accept the same three forms: a bracketed list `["A", "B", "C"]`, a bare comma-separated string, or a real Python list.
136
+
137
+ The bracketed form is the one to prefer, and the only one that can hold a value containing a comma.
138
+
139
+ **See [List Properties](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/src/ListProperties.md)** for which properties use it and why seven separate parsers became one.
140
+
141
+ ---
142
+
143
+ ## Designer Hints
144
+
145
+ Notes for working in Pygubu Designer: how images resolve at runtime, what clearing a field does, which widgets can only be selected from the widget tree, and what the light green background means.
146
+
147
+ **See [Designer Hints](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/src/DesignerHints.md).** Skip it if you build your interfaces in code.
148
+
149
+ ---
150
+
151
+ ## Comprehensive Component Catalog
152
+
153
+ The reference manual for this library is provided [here](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/README.md) and the [pdf](https://github.com/AJ6CU/sCustomTkinter/blob/main/docs/sCustomTkinterReferenceManual.pdf) The following is a summary of the library:
154
+
155
+
156
+ ### Standard CustomTkinter Widgets
157
+
158
+ All of the following are subclassed from their respective CTk. For example, sCTkCheckBox is a subclass of CTkCheckBox that includes the theming engine of `sCustomTkinter`
159
+
160
+
161
+ #### Containers
162
+ * <u>`sCTk`</u>: The core main window master shell container. A clean, direct pass-through wrapper for `customtkinter.CTk`.
163
+
164
+
165
+ * <u>`sCTkToplevel`</u>: Often used for modal configuration screens and popup alert logs cleanly.
166
+
167
+
168
+ * <u>`sCTkFrame`</u>: Commonly used to group and organized a set of widgets that internally need to be placed relative to each other.
169
+
170
+
171
+ * <u>`sCTkScrollableFrame`</u>: Provides a Frame with scrollbars. Very convenient widget as it avoids the complexity of adding a sCTkSCrollbar to a frame.
172
+
173
+
174
+ #### Controls and Display
175
+ * <u>sCTkButtons</u>: There are three levels of buttons included in the library.
176
+ - `sCTkButtonPrimary` - Provides high-visibility, accented action button featuring integrated hover loops and dynamic panel lock desaturation states. Use this for the action the user should take.
177
+ - `sCTkButtonSecondary` - A toned down button used for less likely options or end points. You might use this for the Cancel button.
178
+ - `sCTkButtonTertiary` - Known in the industry as a `Ghost Button`, this button is almost invisible. Use this for low probability selections.
179
+
180
+
181
+ * <u>`sCTkCheckBox`</u>: Used to enable/disable a feature function.
182
+
183
+
184
+ * <u>Entry Fields</u>: There are two levels of Entry Fields included in this library.
185
+
186
+ - `sCTkEntryPrimary` - It is recommended that you use this one for key or required input.
187
+ - `sCTkEntrySecondary` - This one might be more appropriate for optional input.
188
+
189
+
190
+ * <u>Labels</u>: Used to describe options or communicate information to the end user.
191
+
192
+ - `sCTkLabelPrimary` A bold, larger font size element used for high-contrast foreground labels. This one is typically used for Headers/Titles/Sections.
193
+ - `sCTkLabelSecondary`: A crisp typography item engineered for tabular listings, lane statuses, and technical readouts.
194
+ - `sCTkLabelTertiary`: Much smaller font. You would probably use this one for informational notices.
195
+
196
+
197
+ * <u>`sCTkProgressBar`</u>: Often used in a popup window to communicate progress on a lengthly task.
198
+
199
+
200
+ * <u>`sCTkRadioButton`</u>: Typically a set of 2 or more would be parented in a Frame. Pushing one button, automatically "unpushes" the currently pushed button. This widget gets its name for old car radios where each button was attached to a different radio station.
201
+
202
+
203
+ * <u>`sCTkScrollbar`</u>: An independent widget that can be attached to a Frame, Canvas or other scrollable object. See `sCTkScrollArea` for additional flexibility.
204
+
205
+
206
+ * <u>`sCTkSegmentedButton`</u>: Imagine 3 buttons smashed together. Click one of the buttons to fire a callback. Tho actions of the buttons are mutually exclusive. Selecting one unselects the others just like a RadioButton.
207
+
208
+
209
+ * <u>`sCTkSlider`</u>:: Used to adjust a value. Slide the handle one way or another. Both Horizontal and Vertical positioning are supported.
210
+
211
+
212
+ * <u>`sCTkSwitch`</u>: Simple slide switch for values that are on or off. Its disabled appearance has been retuned so the handle and track stay distinguishable in both light and dark modes.
213
+
214
+
215
+ * <u>`sCTkTabview`</u>: A multi-page layout container. Select the page by click the tab. Useful to minimize footprint and organize common operations while isolating those that are either irrelevant or conflicting.
216
+
217
+
218
+ * <u>Textboxes</u>: Two levels of text boxes are supported for different needs of your users.
219
+ - `sCTkTextboxPrimary` - The standard textbox that you will probably use most of the time.
220
+ - `sCTkTextboxSecondary` - Smaller font that you might find useful for other purposes.
221
+
222
+
223
+
224
+ #### Menus
225
+
226
+ * <u>`sCTkComboBox`</u>: Drop down menu of choices. But more importantly, can accept user input.
227
+
228
+
229
+
230
+ * <u>OptionMenus</u>: Two levels of optionsMenus (basically da rop down list that the user selects an item from) are provided.
231
+
232
+ - `sCTkOptionMenuPrimary`: Larger font with stronger colors. Probably the one you will use for your main options
233
+ - `sCTkOptionMenuSecondary`: Smaller font, less obvious colors. Use for less common options.
234
+
235
+
236
+ ### Additional Widgets provided by `sCustomTkinter`
237
+ * <u>sCTkDial</u>: A set of 3 Dials/Knobs.
238
+
239
+ - `sCTkDialContinuous` - This dial can turn forever clockwise or counterclockwise. Think of a knob to rune in a radio station.
240
+ - `sCTkDialRange` - Has a stop/end point with user setable "ticks" A volume knob would be a good use for this widget.
241
+ - `sCTkDialSelector` - Provide a fixed number of selections. For example, "AM", "FM", "HF", etc.
242
+
243
+
244
+ * <u>`sCTkDialog`</u>: A popup dialog with a heading, a content area you fill, and a row of Apply / Cancel / Reset buttons. It creates its own window, so you do not build a `Toplevel` around it.
245
+
246
+
247
+ * <u>`sCTkFileExplorer`</u>: Allows for browsing and selection of files or directories. You provide the infrastructure on when this is popped up and what are the selection criteria.
248
+
249
+
250
+ * <u>Labeled Frames</u>: Just a Frame with a build in Label. Built on a ScrollableFrame with the scrollbar disabled.
251
+
252
+ - `sCTkFrameLabeledPrimary` - Larger font for Label. You would probably use this as an outer frame.
253
+ - `sCTkFrameLabeledSecondary` - Smaller fonts and border. Useful to group similar settings that you want to identify by a name.
254
+
255
+
256
+ * <u>Messagebox</u>: Used to communicate immediate and perhaps actionable information to the user. There are three types, Info, Warning and Error. And each can be configured for a customized single or two button response.
257
+ - `sCTkMessagebox.showinfo`
258
+ - `sCTkMessagebox.showwarning`
259
+ - `sCTkMessagebox.showerror`
260
+ - `sCTkMessagebox.askyesno`
261
+ - `sCTkMessagebox.askwarningyesno`
262
+ - `sCTkMessagebox.askerroryesno`
263
+
264
+ * <u>`sCTkPathChooser`</u>: Preconfigured file/directory selection widget.
265
+
266
+
267
+ * <u>`sCTkScrollArea`</u>: Addon to `sCTkScrollbar` that allows you to identify what scrolls when the cursor is within the widget.
268
+
269
+
270
+ * <u>`sCTkSelector`</u>: Allows the single or multiselection of properties. Also optionally includes a search bar.
271
+
272
+
273
+ * <u>`sCTkSeparator`</u>: Used to place a line between different widgets. Lines can be solid, dashed and include text.
274
+
275
+
276
+ * <u>`sCTkSMeter`</u>: Classical analog sweep meter for displaying signal strength.
277
+
278
+
279
+ * <u>`sCTkSMeterBar`</u>: Similar to the SMeter, the information is displayed as "bars". Natively supports S, SWR and PWR.
280
+
281
+
282
+ * <u>`sCTkSpinbox`</u>: Classical widget where different values can be selected by clicking the up/down arrows. Both numbers and text are supports.
283
+
284
+
285
+
286
+ * <u>`sCTkTableview`</u>: Supports the display of data in a table like format. Includes in place editing as well as different styles of display ("grid, "zebra", "none")
287
+
288
+
289
+
290
+ ## Repository Directory Structure
291
+
292
+ ```text
293
+ sCustomTkinter/ (The GitHub repository root)
294
+ ├── README.md (This file)
295
+ ├── pyproject.toml (Package metadata and dependencies)
296
+ ├── LICENSE
297
+ │
298
+ ├── scustomtkinter/ (The library package)
299
+ │ ├── __init__.py (Top-level import map)
300
+ │ ├── themeable_widget.py (Theme resolution, shared helpers)
301
+ │ ├── sctk_core.py (sCTk, the root window)
302
+ │ ├── sctk_<widget>.py (One module per widget)
303
+ │ └── assets/
304
+ │ ├── sCTkThemes.json (Master stylesheet)
305
+ │ └── images/ (Message box icons)
306
+ │
307
+ ├── scustomtkinter_pygubu/ (Pygubu Designer integration)
308
+ │ ├── sCTk<Widget>bo.py (One builder object per widget)
309
+ │ └── designer/
310
+ │ ├── plugin.py (Preview classes and Designer hooks)
311
+ │ └── properties.py (Property registration)
312
+ │
313
+ ├── docs/
314
+ │ ├── README.md (The built manual, one file)
315
+ │ ├── sCustomTkinterReferenceManual.pdf
316
+ │ └── src/ (Per-widget and shared source pages)
317
+ │ └── images/ (Light and dark screenshots)
318
+ │
319
+ ├── dev/
320
+ │ ├── docs/Developing.md (Notes for extending the library)
321
+ │ └── attic/ (Retired code kept for reference, not packaged)
322
+ │
323
+ ├── examples/ (Runnable test harnesses)
324
+ │
325
+ └── tools/
326
+ └── buildDoc.sh (Concatenates docs/src into docs/README.md)
327
+ ```
328
+ ---
329
+
330
+ ## License
331
+
332
+ `sCustomTkinter` is released under the MIT License. See [LICENSE](https://github.com/AJ6CU/sCustomTkinter/blob/main/LICENSE) for the full text.
333
+
334
+ This project builds on [CustomTkinter](https://customtkinter.tomschimansky.com/) by Tom Schimansky, also MIT licensed. Individual widgets derived from other MIT-licensed community work carry their attribution in the source file's module docstring.
335
+
336
+ You may use, modify, and distribute this library, including in commercial and closed-source products. The only requirement is that the copyright notice and licence text travel with any substantial portion of the code you redistribute.