scustomtkinter 0.2.1__tar.gz → 0.2.2__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/scustomtkinter.egg-info → scustomtkinter-0.2.2}/PKG-INFO +9 -5
  2. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/README.md +8 -4
  3. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/pyproject.toml +1 -1
  4. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_frequency_display.py +20 -0
  5. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_notebook.py +22 -2
  6. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2/scustomtkinter.egg-info}/PKG-INFO +9 -5
  7. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/LICENSE +0 -0
  8. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/MANIFEST.in +0 -0
  9. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/__init__.py +0 -0
  10. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/assets/images/error.png +0 -0
  11. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/assets/images/info.png +0 -0
  12. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/assets/images/warning.png +0 -0
  13. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/assets/sCTkThemes.json +0 -0
  14. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/license_morecustomtkinterwidgets.txt +0 -0
  15. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_button_primary.py +0 -0
  16. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_button_secondary.py +0 -0
  17. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_button_tertiary.py +0 -0
  18. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_checkbox.py +0 -0
  19. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_combobox.py +0 -0
  20. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_core.py +0 -0
  21. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_dial.py +0 -0
  22. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_dialog.py +0 -0
  23. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_dialog_toplevel.py +0 -0
  24. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_entry_primary.py +0 -0
  25. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_entry_secondary.py +0 -0
  26. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_file_explorer.py +0 -0
  27. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_frame.py +0 -0
  28. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_frame_labeled_primary.py +0 -0
  29. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_frame_labeled_secondary.py +0 -0
  30. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_label_primary.py +0 -0
  31. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_label_secondary.py +0 -0
  32. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_label_tertiary.py +0 -0
  33. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_messagebox.py +0 -0
  34. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_optionmenu_border_mixin.py +0 -0
  35. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_optionmenu_primary.py +0 -0
  36. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_optionmenu_secondary.py +0 -0
  37. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_path_chooser.py +0 -0
  38. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_progress_bar.py +0 -0
  39. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_radiobutton.py +0 -0
  40. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_scroll_mixin.py +0 -0
  41. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_scrollable_frame.py +0 -0
  42. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_scrollbar.py +0 -0
  43. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_segmentedbutton.py +0 -0
  44. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_selector.py +0 -0
  45. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_separator.py +0 -0
  46. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_slider.py +0 -0
  47. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_smeter.py +0 -0
  48. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_smeter_bar.py +0 -0
  49. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_spinbox.py +0 -0
  50. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_switch.py +0 -0
  51. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_tableview.py +0 -0
  52. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_tabview.py +0 -0
  53. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_textbox_primary.py +0 -0
  54. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_textbox_secondary.py +0 -0
  55. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/sctk_toplevel.py +0 -0
  56. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter/themeable_widget.py +0 -0
  57. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter.egg-info/SOURCES.txt +0 -0
  58. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter.egg-info/dependency_links.txt +0 -0
  59. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter.egg-info/entry_points.txt +0 -0
  60. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter.egg-info/requires.txt +0 -0
  61. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter.egg-info/top_level.txt +0 -0
  62. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/__init__.py +0 -0
  63. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/designer/__init__.py +0 -0
  64. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/designer/plugin.py +0 -0
  65. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/designer/properties.py +0 -0
  66. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkButtonPrimarybo.py +0 -0
  67. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkButtonSecondarybo.py +0 -0
  68. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkButtonTertiarybo.py +0 -0
  69. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkCheckBoxbo.py +0 -0
  70. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkComboBoxbo.py +0 -0
  71. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkCorebo.py +0 -0
  72. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkDialbo.py +0 -0
  73. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkDialogbo.py +0 -0
  74. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkEntryPrimarybo.py +0 -0
  75. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkEntrySecondarybo.py +0 -0
  76. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkFileExplorerbo.py +0 -0
  77. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkFrameLabeledPrimarybo.py +0 -0
  78. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkFrameLabeledSecondarybo.py +0 -0
  79. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkFramebo.py +0 -0
  80. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkFrequencyDisplaybo.py +0 -0
  81. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkLabelPrimarybo.py +0 -0
  82. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkLabelSecondarybo.py +0 -0
  83. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkLabelTertiarybo.py +0 -0
  84. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkNotebookbo.py +0 -0
  85. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkOptionMenuPrimarybo.py +0 -0
  86. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkOptionMenuSecondarybo.py +0 -0
  87. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkPathChooserbo.py +0 -0
  88. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkProgressBarbo.py +0 -0
  89. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkRadioButtonbo.py +0 -0
  90. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSMeterBarbo.py +0 -0
  91. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSMeterbo.py +0 -0
  92. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkScrollableFramebo.py +0 -0
  93. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkScrollbarbo.py +0 -0
  94. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSegmentedButtonbo.py +0 -0
  95. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSelectorbo.py +0 -0
  96. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSeparatorbo.py +0 -0
  97. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSliderbo.py +0 -0
  98. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSpinboxbo.py +0 -0
  99. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkSwitchbo.py +0 -0
  100. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkTableviewbo.py +0 -0
  101. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkTabviewbo.py +0 -0
  102. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkTextboxPrimarybo.py +0 -0
  103. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkTextboxSecondarybo.py +0 -0
  104. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkToplevelbo.py +0 -0
  105. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/scustomtkinter_pygubu/sCTkWidgetSetForPygubuDesigner.py +0 -0
  106. {scustomtkinter-0.2.1 → scustomtkinter-0.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scustomtkinter
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Themeable widgets for CustomTkinter -- tiers of buttons, labels and entries, dials, meters, tables and file choosers -- with Pygubu Designer support.
5
5
  Author: Mark J. Hatch (AJ6CU)
6
6
  License-Expression: MIT
@@ -62,12 +62,14 @@ Install it from PyPI:
62
62
  pip install scustomtkinter
63
63
  ```
64
64
 
65
- With the Pygubu Designer plugin and the Designer itself:
65
+ To lay out windows in Pygubu Designer as well, add the `designer` extra, which also installs Pygubu and Pygubu Designer:
66
66
 
67
67
  ```bash
68
68
  pip install "scustomtkinter[designer]"
69
69
  ```
70
70
 
71
+ The widgets themselves never need Pygubu, so a program that only uses them needs just the first command. Keep the quotation marks: zsh, the macOS shell, otherwise reads the square brackets as a file pattern and stops with `no matches found`.
72
+
71
73
  In PyCharm, search for `scustomtkinter` in the Python Packages window.
72
74
 
73
75
  The latest development version, ahead of the last release, comes straight from GitHub (this needs git):
@@ -102,9 +104,11 @@ root.mainloop()
102
104
 
103
105
  ### Pygubu-Designer Installation
104
106
 
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!
107
+ 1. Install into a virtual environment with the `designer` extra: `pip install "scustomtkinter[designer]"`. With sCustomTkinter already installed, the same command adds just Pygubu and the Designer.
108
+ 2. Start it from that environment with `pygubu-designer`. The sCustomTkinter widgets are at the bottom of the component list on the left.
109
+ 3. Add an sCTk root or an sCTkToplevel, and build from there.
110
+
111
+ Run the Designer from the same virtual environment as the library. A `pygubu-designer` installed somewhere else, such as a global Python, loads that environment's packages instead; `which pygubu-designer` shows which one starts.
108
112
 
109
113
  ## Theming
110
114
 
@@ -35,12 +35,14 @@ Install it from PyPI:
35
35
  pip install scustomtkinter
36
36
  ```
37
37
 
38
- With the Pygubu Designer plugin and the Designer itself:
38
+ To lay out windows in Pygubu Designer as well, add the `designer` extra, which also installs Pygubu and Pygubu Designer:
39
39
 
40
40
  ```bash
41
41
  pip install "scustomtkinter[designer]"
42
42
  ```
43
43
 
44
+ The widgets themselves never need Pygubu, so a program that only uses them needs just the first command. Keep the quotation marks: zsh, the macOS shell, otherwise reads the square brackets as a file pattern and stops with `no matches found`.
45
+
44
46
  In PyCharm, search for `scustomtkinter` in the Python Packages window.
45
47
 
46
48
  The latest development version, ahead of the last release, comes straight from GitHub (this needs git):
@@ -75,9 +77,11 @@ root.mainloop()
75
77
 
76
78
  ### Pygubu-Designer Installation
77
79
 
78
- 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.
79
- 2. Start Pygubu-Designer, you will see the sCustomTkinter widgets at the bottom of the Components on the left.
80
- 3. Add a sCTK root or a sCTkToplevel and go!
80
+ 1. Install into a virtual environment with the `designer` extra: `pip install "scustomtkinter[designer]"`. With sCustomTkinter already installed, the same command adds just Pygubu and the Designer.
81
+ 2. Start it from that environment with `pygubu-designer`. The sCustomTkinter widgets are at the bottom of the component list on the left.
82
+ 3. Add an sCTk root or an sCTkToplevel, and build from there.
83
+
84
+ Run the Designer from the same virtual environment as the library. A `pygubu-designer` installed somewhere else, such as a global Python, loads that environment's packages instead; `which pygubu-designer` shows which one starts.
81
85
 
82
86
  ## Theming
83
87
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "scustomtkinter"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  authors = [
9
9
  { name = "Mark J. Hatch (AJ6CU)" }
10
10
  ]
@@ -385,6 +385,26 @@ class sCTkFrequencyDisplay(ctk.CTkFrame, ThemeableWidget):
385
385
  except Exception:
386
386
  pass
387
387
 
388
+ def _set_scaling(self, *args, **kwargs):
389
+ """
390
+ Resizes and redraws when the scaling changes.
391
+
392
+ FIX (2026-11-13): THE DIGITS WERE CUT OFF AT 200 % ON WINDOWS (Mark,
393
+ ThinkPad X1 Carbon, uBITX CEC Desktop). The readout measures the room
394
+ it needs once, when it is made, from the font at that scale -- and on
395
+ Windows the display's scale reaches CustomTkinter a moment later.
396
+ The digits were then drawn at the new size in a canvas still sized for
397
+ the old one: "13.991." with the rest off the edge. CustomTkinter calls
398
+ this on every widget when the scaling changes (the display's scale
399
+ arriving, the window moving to another display, or the app setting
400
+ one), and the canvas is drawn, so nothing else would update it -- the
401
+ S-meters do the same.
402
+ """
403
+ super()._set_scaling(*args, **kwargs)
404
+ if getattr(self, "canvas", None) is not None and self.canvas.winfo_exists():
405
+ self._resize_to_fit()
406
+ self._draw_display()
407
+
388
408
  # ------------------------------------------------------------------
389
409
  # Drawing
390
410
  # ------------------------------------------------------------------
@@ -160,7 +160,13 @@ class sCTkNotebook(ctk.CTkFrame, ThemeableWidget):
160
160
  # assigning that name here replaces the frame's reference to it and
161
161
  # its _draw() would then paint on this widget's canvas instead. The
162
162
  # dials and the S-meters use the bare name for exactly this reason.
163
- self.canvas = ctk.CTkCanvas(self, highlightthickness=0, bd=0)
163
+ # FIX (2026-11-13): width/height 1. A canvas given no size asks for
164
+ # Tk's default, 10 x 7 cm -- measured in physical units, so it grows
165
+ # with the display's DPI apart from CustomTkinter's scaling -- and the
166
+ # notebook asked for at least that whatever its pages needed (394x276
167
+ # at 1x for a 300x200 page). The canvas only draws the strip and the
168
+ # page border over whatever room the pages give it.
169
+ self.canvas = ctk.CTkCanvas(self, highlightthickness=0, bd=0, width=1, height=1)
164
170
  # GRIDDED, not placed, and lowered behind the pages.
165
171
  #
166
172
  # place() takes a widget out of the geometry negotiation entirely: a
@@ -308,6 +314,14 @@ class sCTkNotebook(ctk.CTkFrame, ThemeableWidget):
308
314
  value = getattr(self, self._THEMEABLE_GEOMETRY[key])
309
315
  return self._apply_widget_scaling(float(value))
310
316
 
317
+ def _geom_unscaled(self, key):
318
+ """A geometry value as the theme or class gives it, before scaling --
319
+ for options CustomTkinter scales itself (padx/pady to its grid())."""
320
+ value = self._local_defaults.get(key)
321
+ if value is None:
322
+ value = getattr(self, self._THEMEABLE_GEOMETRY[key])
323
+ return float(value)
324
+
311
325
  def _sx(self, value):
312
326
  """Scales a dimension for drawing. Used on every geometry constant."""
313
327
  return self._apply_widget_scaling(value)
@@ -392,7 +406,13 @@ class sCTkNotebook(ctk.CTkFrame, ThemeableWidget):
392
406
  notebook's own -- see the note where the canvas is gridded.
393
407
  """
394
408
  strip = int(self._sx(self._tab_width))
395
- pad = int(self._geom("page_inset") + self._geom("border_width")) \
409
+ # FIX (2026-11-13): UNSCALED. The page host is a CustomTkinter frame,
410
+ # whose grid() scales padx/pady itself; scaled here as well, the inset
411
+ # was scaled twice -- 10 px at 1x, 40 px at 2x instead of 20 (found
412
+ # checking every widget at 200 % for uBITX CEC Desktop on Windows).
413
+ # The same at 1x, which is why it never showed. The strip's column
414
+ # minsize below is Tk's own and takes real pixels, so it stays scaled.
415
+ pad = int(self._geom_unscaled("page_inset") + self._geom_unscaled("border_width")) \
396
416
  if self._show_page_border else 0
397
417
 
398
418
  strip_col, page_col = (0, 1) if self._side == "left" else (1, 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scustomtkinter
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Themeable widgets for CustomTkinter -- tiers of buttons, labels and entries, dials, meters, tables and file choosers -- with Pygubu Designer support.
5
5
  Author: Mark J. Hatch (AJ6CU)
6
6
  License-Expression: MIT
@@ -62,12 +62,14 @@ Install it from PyPI:
62
62
  pip install scustomtkinter
63
63
  ```
64
64
 
65
- With the Pygubu Designer plugin and the Designer itself:
65
+ To lay out windows in Pygubu Designer as well, add the `designer` extra, which also installs Pygubu and Pygubu Designer:
66
66
 
67
67
  ```bash
68
68
  pip install "scustomtkinter[designer]"
69
69
  ```
70
70
 
71
+ The widgets themselves never need Pygubu, so a program that only uses them needs just the first command. Keep the quotation marks: zsh, the macOS shell, otherwise reads the square brackets as a file pattern and stops with `no matches found`.
72
+
71
73
  In PyCharm, search for `scustomtkinter` in the Python Packages window.
72
74
 
73
75
  The latest development version, ahead of the last release, comes straight from GitHub (this needs git):
@@ -102,9 +104,11 @@ root.mainloop()
102
104
 
103
105
  ### Pygubu-Designer Installation
104
106
 
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!
107
+ 1. Install into a virtual environment with the `designer` extra: `pip install "scustomtkinter[designer]"`. With sCustomTkinter already installed, the same command adds just Pygubu and the Designer.
108
+ 2. Start it from that environment with `pygubu-designer`. The sCustomTkinter widgets are at the bottom of the component list on the left.
109
+ 3. Add an sCTk root or an sCTkToplevel, and build from there.
110
+
111
+ Run the Designer from the same virtual environment as the library. A `pygubu-designer` installed somewhere else, such as a global Python, loads that environment's packages instead; `which pygubu-designer` shows which one starts.
108
112
 
109
113
  ## Theming
110
114
 
File without changes
File without changes