ttkbootstrap 2.2.3__tar.gz → 2.2.5__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 (169) hide show
  1. {ttkbootstrap-2.2.3/src/ttkbootstrap.egg-info → ttkbootstrap-2.2.5}/PKG-INFO +2 -2
  2. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/pyproject.toml +2 -2
  3. ttkbootstrap-2.2.5/src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py +3 -0
  4. ttkbootstrap-2.2.5/src/ttkbootstrap/style/builders/scrollbar.py +242 -0
  5. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/engine.py +1 -0
  6. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/scrolled.py +6 -0
  7. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5/src/ttkbootstrap.egg-info}/PKG-INFO +2 -2
  8. ttkbootstrap-2.2.5/src/ttkbootstrap.egg-info/requires.txt +1 -0
  9. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_pyinstaller_hook.py +13 -7
  10. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_scrolled_api.py +21 -0
  11. ttkbootstrap-2.2.3/src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py +0 -3
  12. ttkbootstrap-2.2.3/src/ttkbootstrap/style/builders/scrollbar.py +0 -234
  13. ttkbootstrap-2.2.3/src/ttkbootstrap.egg-info/requires.txt +0 -1
  14. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/LICENSE +0 -0
  15. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/MANIFEST.in +0 -0
  16. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/README.md +0 -0
  17. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/setup.cfg +0 -0
  18. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/__init__.py +0 -0
  19. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/__init__.pyi +0 -0
  20. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/__main__.py +0 -0
  21. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/_pyinstaller/__init__.py +0 -0
  22. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/__init__.py +0 -0
  23. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.ico +0 -0
  24. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.png +0 -0
  25. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/README.md +0 -0
  26. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/__init__.py +0 -0
  27. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/checkbox-checked.png +0 -0
  28. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/checkbox-indeterminate.png +0 -0
  29. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/checkbox-unchecked.png +0 -0
  30. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/manifest.json +0 -0
  31. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/progressbar-default.png +0 -0
  32. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/progressbar-thin.png +0 -0
  33. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/radio.png +0 -0
  34. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/sizegrip.png +0 -0
  35. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/slider-handle.png +0 -0
  36. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/slider-track.png +0 -0
  37. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/switch-round.png +0 -0
  38. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/elements/switch-square.png +0 -0
  39. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/icons/LICENSE +0 -0
  40. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/icons/README.md +0 -0
  41. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/icons/bootstrap.ttf +0 -0
  42. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/icons/glyphmap.json +0 -0
  43. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/assets/icons/icon_metrics.json +0 -0
  44. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/cli.py +0 -0
  45. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/colorutils.py +0 -0
  46. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/constants.py +0 -0
  47. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/convert_theme.py +0 -0
  48. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/__init__.py +0 -0
  49. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/base.py +0 -0
  50. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/colorchooser.py +0 -0
  51. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/colordropper.py +0 -0
  52. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/datepicker.py +0 -0
  53. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/filedialog.py +0 -0
  54. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/fontdialog.py +0 -0
  55. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/message.py +0 -0
  56. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/dialogs/query.py +0 -0
  57. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/__init__.py +0 -0
  58. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/busy.py +0 -0
  59. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/configure_delegation.py +0 -0
  60. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/positioning.py +0 -0
  61. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/publisher.py +0 -0
  62. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/utility.py +0 -0
  63. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/internal/wheel.py +0 -0
  64. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/localization/README.md +0 -0
  65. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/localization/__init__.py +0 -0
  66. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/localization/api.py +0 -0
  67. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/localization/msgcat.py +0 -0
  68. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/localization/msgs.py +0 -0
  69. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/menu.py +0 -0
  70. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/publisher.py +0 -0
  71. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/py.typed +0 -0
  72. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/__init__.py +0 -0
  73. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/_compat.py +0 -0
  74. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/assets.py +0 -0
  75. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/bootstyle.py +0 -0
  76. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/__init__.py +0 -0
  77. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/button.py +0 -0
  78. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/calendar.py +0 -0
  79. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/checkbutton.py +0 -0
  80. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/combobox.py +0 -0
  81. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/entry.py +0 -0
  82. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/floodgauge.py +0 -0
  83. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/frame.py +0 -0
  84. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/label.py +0 -0
  85. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/labelframe.py +0 -0
  86. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/menubutton.py +0 -0
  87. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/notebook.py +0 -0
  88. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/panedwindow.py +0 -0
  89. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/progressbar.py +0 -0
  90. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/radiobutton.py +0 -0
  91. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/registry.py +0 -0
  92. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/scale.py +0 -0
  93. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/separator.py +0 -0
  94. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/sizegrip.py +0 -0
  95. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/spinbox.py +0 -0
  96. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/toggle.py +0 -0
  97. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/toolbutton.py +0 -0
  98. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/treeview.py +0 -0
  99. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders/utils.py +0 -0
  100. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders_tk.py +0 -0
  101. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/builders_ttk.py +0 -0
  102. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/elements.py +0 -0
  103. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/icons.py +0 -0
  104. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/layout.py +0 -0
  105. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/scaling.py +0 -0
  106. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/style/theme.py +0 -0
  107. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/themes/__init__.py +0 -0
  108. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/themes/builtin.py +0 -0
  109. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/themes/legacy.py +0 -0
  110. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/themes/standard.py +0 -0
  111. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utility.py +0 -0
  112. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/__init__.py +0 -0
  113. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/color.py +0 -0
  114. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/config.py +0 -0
  115. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/fonts.py +0 -0
  116. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/platform.py +0 -0
  117. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/utils/scaling.py +0 -0
  118. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/validation.py +0 -0
  119. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/__init__.py +0 -0
  120. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/dateentry.py +0 -0
  121. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/floodgauge.py +0 -0
  122. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/labeledscale.py +0 -0
  123. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/meter.py +0 -0
  124. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/tableview.py +0 -0
  125. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/toast.py +0 -0
  126. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/widgets/tooltip.py +0 -0
  127. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap/window.py +0 -0
  128. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap.egg-info/SOURCES.txt +0 -0
  129. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap.egg-info/dependency_links.txt +0 -0
  130. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap.egg-info/entry_points.txt +0 -0
  131. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkbootstrap.egg-info/top_level.txt +0 -0
  132. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkcreator/__init__.py +0 -0
  133. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/src/ttkcreator/__main__.py +0 -0
  134. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_bootstyle_grammar.py +0 -0
  135. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_bootstyle_value_tokens.py +0 -0
  136. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_busy_api.py +0 -0
  137. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_cli_api.py +0 -0
  138. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_config_api.py +0 -0
  139. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_configure_delegation.py +0 -0
  140. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_convert_theme.py +0 -0
  141. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_dateentry_api.py +0 -0
  142. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_dialogs_api.py +0 -0
  143. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_durable_style_options.py +0 -0
  144. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_filedialog_api.py +0 -0
  145. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_floodgauge_api.py +0 -0
  146. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_fonts_api.py +0 -0
  147. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_icon_drop.py +0 -0
  148. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_icon_theme.py +0 -0
  149. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_labeledscale_tooltip_api.py +0 -0
  150. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_menu_api.py +0 -0
  151. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_menu_border.py +0 -0
  152. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_meter_api.py +0 -0
  153. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_mixin_api.py +0 -0
  154. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_scaling.py +0 -0
  155. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_scroll_events.py +0 -0
  156. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_style_package.py +0 -0
  157. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_style_reference.py +0 -0
  158. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_surface_color.py +0 -0
  159. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_surface_families.py +0 -0
  160. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_surface_grammar.py +0 -0
  161. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_tableview_api.py +0 -0
  162. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_toast_api.py +0 -0
  163. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_toolkit.py +0 -0
  164. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_treeview_rowheight.py +0 -0
  165. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_utility_api.py +0 -0
  166. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_widget_catalog_coverage.py +0 -0
  167. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_widget_reexports.py +0 -0
  168. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_widget_stubs.py +0 -0
  169. {ttkbootstrap-2.2.3 → ttkbootstrap-2.2.5}/tests/test_window_api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttkbootstrap
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Summary: Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
@@ -22,7 +22,7 @@ Classifier: Operating System :: OS Independent
22
22
  Requires-Python: >=3.10
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- Requires-Dist: pillow<13,>=10
25
+ Requires-Dist: pillow<14,>=10
26
26
  Dynamic: license-file
27
27
 
28
28
  [![CI](https://github.com/israel-dryer/ttkbootstrap/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/israel-dryer/ttkbootstrap/actions/workflows/ci.yml)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ttkbootstrap"
7
- version = "2.2.3"
7
+ version = "2.2.5"
8
8
  description = "Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -43,7 +43,7 @@ classifiers = [
43
43
  "Operating System :: OS Independent",
44
44
  ]
45
45
 
46
- dependencies = ["pillow>=10,<13"]
46
+ dependencies = ["pillow>=10,<14"]
47
47
 
48
48
  [project.urls]
49
49
  Homepage = "https://github.com/israel-dryer/ttkbootstrap"
@@ -0,0 +1,3 @@
1
+ from PyInstaller.utils.hooks import collect_data_files, copy_metadata
2
+
3
+ datas = collect_data_files("ttkbootstrap.assets") + copy_metadata("ttkbootstrap")
@@ -0,0 +1,242 @@
1
+ """TTK scrollbar style recipes."""
2
+
3
+ import tkinter as tk
4
+
5
+ from ttkbootstrap.constants import *
6
+ from ttkbootstrap.style import StyleBuilderTTK
7
+ from ttkbootstrap.style.layout import El, image_element, layout, state_map
8
+ from ttkbootstrap.style.builders.registry import register_builder
9
+
10
+
11
+ # A few-pixel thumb for the 'thin' variant -- suits narrow lists/dropdowns.
12
+ _THIN_SCROLLBAR_THICKNESS = 4
13
+ _THIN_SCROLLBAR_MIN_THUMB = 8 # minimum thumb length (logical)
14
+
15
+ # The standard scrollbar thumb thickness (square + round variants).
16
+ _SCROLLBAR_THICKNESS = 8
17
+
18
+
19
+ def _scrollbar_trough(builder):
20
+ """The scrollbar track color: the surface, so the thumb floats with no
21
+ visible channel around it. Honors the 2.0 surface-color token (default ==
22
+ theme bg)."""
23
+ return builder.resolve_surface(builder._surface)
24
+
25
+
26
+ def _scrollbar_thumb_color(builder, colorname):
27
+ """The default (neutral) thumb color, or the accent when a color is given.
28
+
29
+ In light mode the raw border color is too pale to read against the near-white
30
+ trough, so darken it to a clearly visible mid-gray; dark mode's `selectbg`
31
+ already reads against the dark trough.
32
+ """
33
+ if colorname in (DEFAULT, ""):
34
+ if builder.is_light_theme:
35
+ return builder.shade(builder.colors.border, 0.25)
36
+ return builder.colors.selectbg
37
+ return builder.colors.get(colorname)
38
+
39
+
40
+ # Trough margin (logical px) left on each side of the thumb, so the visible
41
+ # trough shows around it. Applied as the thumb's cross-axis padding.
42
+ _SCROLLBAR_THUMB_INSET = 1
43
+ _SCROLLBAR_MIN_THUMB = 16 # minimum thumb length (logical) so it stays grabbable
44
+
45
+
46
+ def _scrollbar_cap(builder, color, trough, orient, end, thickness, length, rounded):
47
+ """One end cap of the thumb: `thickness` across the bar, `length` along it.
48
+
49
+ A round cap is drawn flattened onto the trough color, so the image has no
50
+ transparency: on X11 Tk draws a photo with alpha by reading the window
51
+ back to blend it, a server round trip per draw.
52
+ """
53
+ a = builder.assets
54
+ size = (thickness, length) if orient == "vertical" else (length, thickness)
55
+ if not rounded:
56
+ return a.rect(color, size)
57
+
58
+ def draw(d, w, h):
59
+ d.rectangle((0, 0, w - 1, h - 1), fill=trough)
60
+ # a pill that overhangs the inner edge, so only its rounded end shows
61
+ if orient == "vertical":
62
+ box = [0, 0, w - 1, h - 1 + w] if end == "start" else [0, -w, w - 1, h - 1]
63
+ radius = round(w / 2)
64
+ else:
65
+ box = [0, 0, w - 1 + h, h - 1] if end == "start" else [-h, 0, w - 1, h - 1]
66
+ radius = round(h / 2)
67
+ d.rounded_rectangle(box, radius=radius, fill=color)
68
+
69
+ return a.image(size, draw, "scrollbar-cap", color, trough, orient, end)
70
+
71
+
72
+ def _scrollbar_thumb(builder, ttk_style, orient, thumb, trough, *,
73
+ thickness, inset, cap, rounded):
74
+ """Build the thumb elements of `ttk_style`; returns the thumb layout node.
75
+
76
+ The thumb is a `padding` element (the cross-axis inset) holding a cap image
77
+ at each end around a solid fill that stretches with the thumb. Only the
78
+ caps are images: ttk *tiles* the middle of an image element rather than
79
+ stretching it, so a 9-sliced image thumb is redrawn from tiles once per
80
+ pixel of its length, while the fill is one rectangle at any length. The
81
+ two caps also set the minimum thumb length.
82
+
83
+ The fill is the default theme's `field` element (flat at borderwidth 0),
84
+ colored by `fieldbackground` -- an option nothing else on a scrollbar
85
+ reads, so `background` stays the trough color like every other region.
86
+ """
87
+ vertical = orient == "vertical"
88
+ scaling = builder.style.scaling
89
+ pad = scaling.logical(inset)
90
+ # Size the cap from the full thickness: rounding the inset and the cap
91
+ # separately would add a pixel to the bar at fractional scaling. The
92
+ # physical width is passed back in logical units, which the asset toolkit
93
+ # rounds to the same pixel count.
94
+ cap_thickness = (scaling.logical(thickness) - 2 * pad) / scaling.factor
95
+ builder.configure(ttk_style, fieldbackground=thumb, focuswidth=0,
96
+ padding=(pad, 0) if vertical else (0, pad))
97
+ state_map(builder.style, ttk_style, fieldbackground={
98
+ "pressed": builder.pressed(thumb), "active": builder.active(thumb)})
99
+
100
+ builder.style.element_create(f"{ttk_style}.thumb", "from", TTK_DEFAULT, "padding")
101
+ builder.style.element_create(f"{ttk_style}.fill", "from", TTK_DEFAULT, "field")
102
+ cap_sticky = "ew" if vertical else "ns"
103
+ for end in ("start", "end"):
104
+ def image(color):
105
+ return _scrollbar_cap(builder, color, trough, orient, end,
106
+ cap_thickness, cap, rounded)
107
+ image_element(
108
+ builder.style, f"{ttk_style}.{end}cap", default=image(thumb),
109
+ states={"pressed": image(builder.pressed(thumb)),
110
+ "active": image(builder.active(thumb))},
111
+ sticky=cap_sticky)
112
+
113
+ start_side, end_side = ("top", "bottom") if vertical else ("left", "right")
114
+ return El(f"{ttk_style}.thumb", expand="1", sticky="ns" if vertical else "we",
115
+ children=[
116
+ El(f"{ttk_style}.startcap", side=start_side, sticky=cap_sticky),
117
+ El(f"{ttk_style}.endcap", side=end_side, sticky=cap_sticky),
118
+ El(f"{ttk_style}.fill", sticky="nswe")])
119
+
120
+
121
+ def _build_scrollbar(builder: StyleBuilderTTK, colorname, rounded):
122
+ """Build the horizontal + vertical scrollbar styles (square or round).
123
+
124
+ A subtle visible trough (every region shares the trough color, so the whole
125
+ widget reads as one track) with an inset thumb, no arrows.
126
+ """
127
+ ttk_class = "TScrollbar"
128
+ prefix = "Round." if rounded else ""
129
+ trough = _scrollbar_trough(builder)
130
+ thumb = _scrollbar_thumb_color(builder, colorname)
131
+
132
+ if colorname in (DEFAULT, ""):
133
+ base = prefix
134
+ else:
135
+ base = f"{colorname}.{prefix}"
136
+
137
+ for orient, sticky, trough_el in (
138
+ ("horizontal", "we", "Horizontal.Scrollbar.trough"),
139
+ ("vertical", "ns", "Vertical.Scrollbar.trough"),
140
+ ):
141
+ axis = "Horizontal" if orient == "horizontal" else "Vertical"
142
+ ttk_style = builder.surface_prefix(f"{base}{axis}.{ttk_class}")
143
+ builder.configure(
144
+ ttk_style,
145
+ troughcolor=trough,
146
+ bordercolor=trough,
147
+ background=trough,
148
+ darkcolor=trough,
149
+ lightcolor=trough,
150
+ relief=tk.FLAT,
151
+ borderwidth=0,
152
+ arrowsize=0,
153
+ )
154
+ thumb_el = _scrollbar_thumb(
155
+ builder, ttk_style, orient, thumb, trough,
156
+ thickness=_SCROLLBAR_THICKNESS, inset=_SCROLLBAR_THUMB_INSET,
157
+ cap=_SCROLLBAR_MIN_THUMB // 2, rounded=rounded)
158
+ layout(builder.style, ttk_style,
159
+ El(trough_el, sticky=sticky, children=[thumb_el]))
160
+ builder.register_ttkstyle(ttk_style)
161
+
162
+
163
+ @register_builder("thin", "scrollbar")
164
+ def build_thin_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
165
+ """Create a thin scrollbar style for the ttk.Scrollbar widget.
166
+
167
+ A few-pixel flat thumb on a surface-matched track, no arrows -- for narrow
168
+ lists and dropdowns where the bar is more a scroll *indicator* than a drag
169
+ handle (combobox popdown, font picker, ...). The thumb shares the neutral/
170
+ accent color of the standard bar (`_scrollbar_thumb_color`) and darkens/
171
+ lightens on hover/press. Ported from bootstack (mechanism, not API): a solid
172
+ box thumb rather than a rounded PNG.
173
+
174
+ Parameters:
175
+
176
+ builder (StyleBuilderTTK):
177
+ The style builder
178
+ colorname (str):
179
+ The color label used to style the widget.
180
+ """
181
+ ttk_class = "TScrollbar"
182
+ # The surface the bar sits on (2.0 surface-color); default == theme bg.
183
+ surface = builder.resolve_surface(builder._surface)
184
+ # share the darker, clearly-visible thumb color with the default/round bars
185
+ thumb = _scrollbar_thumb_color(builder, colorname)
186
+
187
+ if any([colorname == DEFAULT, colorname == ""]):
188
+ prefix = "Thin."
189
+ else:
190
+ prefix = f"{colorname}.Thin."
191
+
192
+ for orient, sticky, trough_el in (
193
+ ("horizontal", "we", "Horizontal.Scrollbar.trough"),
194
+ ("vertical", "ns", "Vertical.Scrollbar.trough"),
195
+ ):
196
+ axis = "Horizontal" if orient == "horizontal" else "Vertical"
197
+ ttk_style = builder.surface_prefix(f"{prefix}{axis}.{ttk_class}")
198
+ builder.configure(
199
+ ttk_style,
200
+ troughcolor=surface,
201
+ bordercolor=surface,
202
+ background=surface,
203
+ relief=tk.FLAT,
204
+ borderwidth=0,
205
+ arrowsize=0,
206
+ )
207
+ # a `t`-px-thick sliver that stretches along the track
208
+ thumb_el = _scrollbar_thumb(
209
+ builder, ttk_style, orient, thumb, surface,
210
+ thickness=_THIN_SCROLLBAR_THICKNESS, inset=0,
211
+ cap=_THIN_SCROLLBAR_MIN_THUMB // 2, rounded=False)
212
+ layout(builder.style, ttk_style,
213
+ El(trough_el, sticky=sticky, children=[thumb_el]))
214
+ builder.register_ttkstyle(ttk_style)
215
+
216
+
217
+ @register_builder("round", "scrollbar")
218
+ def build_round_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
219
+ """Create a round style for the ttk.Scrollbar widget.
220
+
221
+ Parameters:
222
+
223
+ builder (StyleBuilderTTK):
224
+ The style builder
225
+ colorname (str):
226
+ The color label used to style the widget.
227
+ """
228
+ _build_scrollbar(builder, colorname, rounded=True)
229
+
230
+
231
+ @register_builder("default", "scrollbar")
232
+ def build_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
233
+ """Create a standard style for the ttk.Scrollbar widget.
234
+
235
+ Parameters:
236
+
237
+ builder (StyleBuilderTTK):
238
+ The style builder.
239
+ colorname (str):
240
+ The color label used to style the widget.
241
+ """
242
+ _build_scrollbar(builder, colorname, rounded=False)
@@ -29,6 +29,7 @@ DURABLE_STYLE_OPTIONS = frozenset({
29
29
  "padding",
30
30
  "borderwidth",
31
31
  "focusthickness",
32
+ "focuswidth",
32
33
  "thickness",
33
34
  "rowheight",
34
35
  "sashthickness",
@@ -413,6 +413,12 @@ class ScrolledFrame(ttk.Frame):
413
413
  )
414
414
  self._vbar.grid(row=0, column=1, sticky=NS)
415
415
  self._canvas.configure(yscrollcommand=self._vbar.set)
416
+ # Reserve the scrollbar's lane so auto-hide (grid_remove/grid on hover)
417
+ # doesn't widen the canvas -- and reflow the content -- when the bar
418
+ # comes and goes. Same as ScrolledText.
419
+ self.container.grid_columnconfigure(
420
+ 1, minsize=self._vbar.winfo_reqwidth()
421
+ )
416
422
 
417
423
  # content frame lives inside the canvas -> native scroll fractions +
418
424
  # native destroy cascade.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttkbootstrap
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Summary: Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease.
5
5
  Author-email: Israel Dryer <israel.dryer@gmail.com>
6
6
  License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
@@ -22,7 +22,7 @@ Classifier: Operating System :: OS Independent
22
22
  Requires-Python: >=3.10
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- Requires-Dist: pillow<13,>=10
25
+ Requires-Dist: pillow<14,>=10
26
26
  Dynamic: license-file
27
27
 
28
28
  [![CI](https://github.com/israel-dryer/ttkbootstrap/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/israel-dryer/ttkbootstrap/actions/workflows/ci.yml)
@@ -0,0 +1 @@
1
+ pillow<14,>=10
@@ -38,14 +38,20 @@ def test_hook_assigns_the_collected_data_to_datas():
38
38
  # PyInstaller reads only the hook's `datas` global. Calling
39
39
  # collect_data_files without assigning it collects nothing, and a text
40
40
  # search for the call cannot tell the difference -- so parse the file.
41
+ # copy_metadata bundles the dist-info that `__version__` is read from;
42
+ # without it a frozen app reports "unknown".
41
43
  tree = ast.parse(_hook_path().read_text(encoding="utf-8-sig"))
42
- collected = [
43
- node.value.args[0].value
44
+ collected = sorted(
45
+ (call.func.id, call.args[0].value)
44
46
  for node in tree.body
45
47
  if isinstance(node, ast.Assign)
46
48
  and [getattr(t, "id", None) for t in node.targets] == ["datas"]
47
- and isinstance(node.value, ast.Call)
48
- and getattr(node.value.func, "id", None) == "collect_data_files"
49
- and node.value.args
50
- ]
51
- assert collected == ["ttkbootstrap.assets"]
49
+ for call in ast.walk(node.value)
50
+ if isinstance(call, ast.Call)
51
+ and isinstance(call.func, ast.Name)
52
+ and call.args
53
+ )
54
+ assert collected == [
55
+ ("collect_data_files", "ttkbootstrap.assets"),
56
+ ("copy_metadata", "ttkbootstrap"),
57
+ ]
@@ -221,6 +221,27 @@ def test_scrolledtext_autohide_does_not_resize_the_frame(root):
221
221
  assert st._border.winfo_reqheight() == h_shown
222
222
 
223
223
 
224
+ def test_scrolledframe_autohide_does_not_reflow_the_content(root):
225
+ # Regression (#1352): hiding the scrollbar collapsed its grid column, so the
226
+ # canvas widened and the content reflowed by the bar's width on every hover
227
+ # crossing. Its lane is now reserved, as in ScrolledText.
228
+ holder = ttk.Frame(root, width=300, height=200)
229
+ holder.pack_propagate(False)
230
+ holder.pack()
231
+ sf = ScrolledFrame(holder, auto_hide=True)
232
+ sf.pack(fill="both", expand=True)
233
+ for i in range(30):
234
+ ttk.Label(sf, text=f"row {i}").pack(anchor="w")
235
+ sf.show_scrollbars()
236
+ sf.update_idletasks()
237
+ # the content window is sized to the canvas, so a stable canvas is a
238
+ # stable content width
239
+ shown = sf._canvas.winfo_width()
240
+ sf.hide_scrollbars()
241
+ sf.update_idletasks()
242
+ assert sf._canvas.winfo_width() == shown
243
+
244
+
224
245
  def test_scrolledtext_focus_drives_the_border_state(root):
225
246
  # The border ring is a ttk state map on the highlight frame; focus toggles
226
247
  # the frame's `focus` state rather than swapping the style name.
@@ -1,3 +0,0 @@
1
- from PyInstaller.utils.hooks import collect_data_files
2
-
3
- datas = collect_data_files("ttkbootstrap.assets")
@@ -1,234 +0,0 @@
1
- """TTK scrollbar style recipes."""
2
-
3
- import tkinter as tk
4
-
5
- from ttkbootstrap.constants import *
6
- from ttkbootstrap.style import StyleBuilderTTK
7
- from ttkbootstrap.style.layout import El, image_element, layout
8
- from ttkbootstrap.style.builders.registry import register_builder
9
-
10
-
11
- # A few-pixel thumb for the 'thin' variant -- suits narrow lists/dropdowns.
12
- _THIN_SCROLLBAR_THICKNESS = 4
13
-
14
- # The standard scrollbar thumb thickness (square + round variants).
15
- _SCROLLBAR_THICKNESS = 8
16
-
17
-
18
- def _scrollbar_trough(builder):
19
- """The scrollbar track color: the surface, so the thumb floats with no
20
- visible channel around it. Honors the 2.0 surface-color token (default ==
21
- theme bg)."""
22
- return builder.resolve_surface(builder._surface)
23
-
24
-
25
- def _scrollbar_thumb_color(builder, colorname):
26
- """The default (neutral) thumb color, or the accent when a color is given.
27
-
28
- In light mode the raw border color is too pale to read against the near-white
29
- trough, so darken it to a clearly visible mid-gray; dark mode's `selectbg`
30
- already reads against the dark trough.
31
- """
32
- if colorname in (DEFAULT, ""):
33
- if builder.is_light_theme:
34
- return builder.shade(builder.colors.border, 0.25)
35
- return builder.colors.selectbg
36
- return builder.colors.get(colorname)
37
-
38
-
39
- # Trough margin (logical px) left on each side of the thumb, so the visible
40
- # trough shows around it. Baked into the thumb image (a transparent margin) --
41
- # ttk's trough borderwidth doesn't reliably inset an image thumb.
42
- _SCROLLBAR_THUMB_INSET = 1
43
- _SCROLLBAR_MIN_THUMB = 16 # minimum thumb length (logical) so it stays grabbable
44
-
45
-
46
- def _scrollbar_thumb(builder, color, orient, rounded):
47
- """A thumb image with a transparent cross-axis margin, so the trough shows
48
- around it. Returns (image_name, border) for `image_element`.
49
-
50
- Square thumbs are a solid rect that stretches uniformly (border 0); round
51
- thumbs are a capped pill 9-sliced along the length so the caps don't
52
- distort when the thumb stretches.
53
- """
54
- a = builder.assets
55
- inset = _SCROLLBAR_THUMB_INSET
56
- t = _SCROLLBAR_THICKNESS
57
- cross = 0 if orient == "vertical" else 1 # x for vertical, y for horizontal
58
-
59
- def draw(d, w, h):
60
- dims = (w, h)
61
- margin = round(dims[cross] * inset / t)
62
- box = [0, 0, w - 1, h - 1]
63
- box[cross] += margin
64
- box[cross + 2] -= margin
65
- if rounded:
66
- radius = round((dims[cross] - 2 * margin) / 2)
67
- d.rounded_rectangle(box, radius=radius, fill=color)
68
- else:
69
- d.rectangle(box, fill=color)
70
-
71
- # A 9-slice border sets the *minimum* thumb length -- its fixed end regions
72
- # can't shrink -- so a long list (e.g. the font family picker) can't squash
73
- # the thumb to a microscopic sliver. For the round thumb those end regions
74
- # also hold the rounded caps.
75
- cap = builder.scale_size(_SCROLLBAR_MIN_THUMB // 2)
76
- length = _SCROLLBAR_MIN_THUMB + 1
77
- if orient == "vertical":
78
- size = (t, length)
79
- border = (0, cap)
80
- else:
81
- size = (length, t)
82
- border = (cap, 0)
83
- return a.image(size, draw, "scrollbar-thumb", color, orient, rounded), border
84
-
85
-
86
- def _build_scrollbar(builder: StyleBuilderTTK, colorname, rounded):
87
- """Build the horizontal + vertical scrollbar styles (square or round).
88
-
89
- A subtle visible trough (every region shares the trough color, so the whole
90
- widget reads as one track) with an inset thumb, no arrows.
91
- """
92
- ttk_class = "TScrollbar"
93
- prefix = "Round." if rounded else ""
94
- trough = _scrollbar_trough(builder)
95
- thumb = _scrollbar_thumb_color(builder, colorname)
96
- pressed = builder.pressed(thumb)
97
- active = builder.active(thumb)
98
-
99
- if colorname in (DEFAULT, ""):
100
- base = prefix
101
- else:
102
- base = f"{colorname}.{prefix}"
103
-
104
- for orient, sticky, trough_el in (
105
- ("horizontal", "we", "Horizontal.Scrollbar.trough"),
106
- ("vertical", "ns", "Vertical.Scrollbar.trough"),
107
- ):
108
- axis = "Horizontal" if orient == "horizontal" else "Vertical"
109
- ttk_style = builder.surface_prefix(f"{base}{axis}.{ttk_class}")
110
- builder.configure(
111
- ttk_style,
112
- troughcolor=trough,
113
- bordercolor=trough,
114
- background=trough,
115
- darkcolor=trough,
116
- lightcolor=trough,
117
- relief=tk.FLAT,
118
- borderwidth=0,
119
- arrowsize=0,
120
- )
121
- normal, border = _scrollbar_thumb(builder, thumb, orient, rounded)
122
- pressed_img, _ = _scrollbar_thumb(builder, pressed, orient, rounded)
123
- active_img, _ = _scrollbar_thumb(builder, active, orient, rounded)
124
- image_element(
125
- builder.style, f"{ttk_style}.thumb", default=normal,
126
- states={"pressed": pressed_img, "active": active_img},
127
- border=border, sticky=sticky)
128
- layout(builder.style, ttk_style,
129
- El(trough_el, sticky=sticky, children=[
130
- El(f"{ttk_style}.thumb", expand="1", sticky=sticky)]))
131
- builder.register_ttkstyle(ttk_style)
132
-
133
-
134
- @register_builder("thin", "scrollbar")
135
- def build_thin_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
136
- """Create a thin scrollbar style for the ttk.Scrollbar widget.
137
-
138
- A few-pixel flat thumb on a surface-matched track, no arrows -- for narrow
139
- lists and dropdowns where the bar is more a scroll *indicator* than a drag
140
- handle (combobox popdown, font picker, ...). The thumb shares the neutral/
141
- accent color of the standard bar (`_scrollbar_thumb_color`) and darkens/
142
- lightens on hover/press. Ported from bootstack (mechanism, not API): a solid
143
- box thumb via the `rect` toolkit rather than a rounded PNG.
144
-
145
- Parameters:
146
-
147
- builder (StyleBuilderTTK):
148
- The style builder
149
- colorname (str):
150
- The color label used to style the widget.
151
- """
152
- ttk_class = "TScrollbar"
153
- # The surface the bar sits on (2.0 surface-color); default == theme bg.
154
- surface = builder.resolve_surface(builder._surface)
155
-
156
- if any([colorname == DEFAULT, colorname == ""]):
157
- h_ttk_style = builder.surface_prefix(f"Thin.Horizontal.{ttk_class}")
158
- v_ttk_style = builder.surface_prefix(f"Thin.Vertical.{ttk_class}")
159
- else:
160
- h_ttk_style = builder.surface_prefix(f"{colorname}.Thin.Horizontal.{ttk_class}")
161
- v_ttk_style = builder.surface_prefix(f"{colorname}.Thin.Vertical.{ttk_class}")
162
- # share the darker, clearly-visible thumb color with the default/round bars
163
- thumb = _scrollbar_thumb_color(builder, colorname)
164
-
165
- active = builder.active(thumb)
166
- pressed = builder.pressed(thumb)
167
- a = builder.assets
168
- t = _THIN_SCROLLBAR_THICKNESS
169
-
170
- def _configure(ttk_style):
171
- builder.configure(
172
- ttk_style,
173
- troughcolor=surface,
174
- bordercolor=surface,
175
- background=surface,
176
- relief=tk.FLAT,
177
- borderwidth=0,
178
- arrowsize=0,
179
- )
180
-
181
- # horizontal: a `t`-px-thick sliver that stretches along the track (EW)
182
- _configure(h_ttk_style)
183
- image_element(
184
- builder.style, f"{h_ttk_style}.thumb",
185
- default=a.rect(thumb, (8, t)),
186
- states={"pressed": a.rect(pressed, (8, t)),
187
- "active": a.rect(active, (8, t))},
188
- border=0, sticky="ew")
189
- layout(builder.style, h_ttk_style,
190
- El("Horizontal.Scrollbar.trough", sticky="we", children=[
191
- El(f"{h_ttk_style}.thumb", expand="1", sticky="we")]))
192
-
193
- # vertical
194
- _configure(v_ttk_style)
195
- image_element(
196
- builder.style, f"{v_ttk_style}.thumb",
197
- default=a.rect(thumb, (t, 8)),
198
- states={"pressed": a.rect(pressed, (t, 8)),
199
- "active": a.rect(active, (t, 8))},
200
- border=0, sticky="ns")
201
- layout(builder.style, v_ttk_style,
202
- El("Vertical.Scrollbar.trough", sticky="ns", children=[
203
- El(f"{v_ttk_style}.thumb", expand="1", sticky="ns")]))
204
-
205
- builder.register_ttkstyle(h_ttk_style)
206
- builder.register_ttkstyle(v_ttk_style)
207
-
208
-
209
- @register_builder("round", "scrollbar")
210
- def build_round_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
211
- """Create a round style for the ttk.Scrollbar widget.
212
-
213
- Parameters:
214
-
215
- builder (StyleBuilderTTK):
216
- The style builder
217
- colorname (str):
218
- The color label used to style the widget.
219
- """
220
- _build_scrollbar(builder, colorname, rounded=True)
221
-
222
-
223
- @register_builder("default", "scrollbar")
224
- def build_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
225
- """Create a standard style for the ttk.Scrollbar widget.
226
-
227
- Parameters:
228
-
229
- builder (StyleBuilderTTK):
230
- The style builder.
231
- colorname (str):
232
- The color label used to style the widget.
233
- """
234
- _build_scrollbar(builder, colorname, rounded=False)
@@ -1 +0,0 @@
1
- pillow<13,>=10
File without changes
File without changes
File without changes
File without changes