ttkbootstrap 2.2.2__tar.gz → 2.2.3__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 (166) hide show
  1. {ttkbootstrap-2.2.2/src/ttkbootstrap.egg-info → ttkbootstrap-2.2.3}/PKG-INFO +1 -1
  2. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/pyproject.toml +9 -2
  3. ttkbootstrap-2.2.3/src/ttkbootstrap/_pyinstaller/__init__.py +8 -0
  4. ttkbootstrap-2.2.3/src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py +3 -0
  5. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3/src/ttkbootstrap.egg-info}/PKG-INFO +1 -1
  6. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap.egg-info/SOURCES.txt +3 -0
  7. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap.egg-info/entry_points.txt +3 -0
  8. ttkbootstrap-2.2.3/tests/test_pyinstaller_hook.py +51 -0
  9. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/LICENSE +0 -0
  10. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/MANIFEST.in +0 -0
  11. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/README.md +0 -0
  12. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/setup.cfg +0 -0
  13. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/__init__.py +0 -0
  14. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/__init__.pyi +0 -0
  15. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/__main__.py +0 -0
  16. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/__init__.py +0 -0
  17. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.ico +0 -0
  18. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.png +0 -0
  19. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/README.md +0 -0
  20. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/__init__.py +0 -0
  21. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/checkbox-checked.png +0 -0
  22. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/checkbox-indeterminate.png +0 -0
  23. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/checkbox-unchecked.png +0 -0
  24. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/manifest.json +0 -0
  25. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/progressbar-default.png +0 -0
  26. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/progressbar-thin.png +0 -0
  27. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/radio.png +0 -0
  28. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/sizegrip.png +0 -0
  29. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/slider-handle.png +0 -0
  30. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/slider-track.png +0 -0
  31. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/switch-round.png +0 -0
  32. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/elements/switch-square.png +0 -0
  33. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/icons/LICENSE +0 -0
  34. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/icons/README.md +0 -0
  35. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/icons/bootstrap.ttf +0 -0
  36. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/icons/glyphmap.json +0 -0
  37. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/assets/icons/icon_metrics.json +0 -0
  38. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/cli.py +0 -0
  39. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/colorutils.py +0 -0
  40. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/constants.py +0 -0
  41. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/convert_theme.py +0 -0
  42. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/__init__.py +0 -0
  43. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/base.py +0 -0
  44. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/colorchooser.py +0 -0
  45. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/colordropper.py +0 -0
  46. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/datepicker.py +0 -0
  47. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/filedialog.py +0 -0
  48. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/fontdialog.py +0 -0
  49. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/message.py +0 -0
  50. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/dialogs/query.py +0 -0
  51. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/__init__.py +0 -0
  52. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/busy.py +0 -0
  53. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/configure_delegation.py +0 -0
  54. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/positioning.py +0 -0
  55. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/publisher.py +0 -0
  56. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/utility.py +0 -0
  57. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/internal/wheel.py +0 -0
  58. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/localization/README.md +0 -0
  59. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/localization/__init__.py +0 -0
  60. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/localization/api.py +0 -0
  61. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/localization/msgcat.py +0 -0
  62. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/localization/msgs.py +0 -0
  63. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/menu.py +0 -0
  64. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/publisher.py +0 -0
  65. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/py.typed +0 -0
  66. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/__init__.py +0 -0
  67. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/_compat.py +0 -0
  68. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/assets.py +0 -0
  69. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/bootstyle.py +0 -0
  70. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/__init__.py +0 -0
  71. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/button.py +0 -0
  72. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/calendar.py +0 -0
  73. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/checkbutton.py +0 -0
  74. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/combobox.py +0 -0
  75. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/entry.py +0 -0
  76. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/floodgauge.py +0 -0
  77. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/frame.py +0 -0
  78. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/label.py +0 -0
  79. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/labelframe.py +0 -0
  80. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/menubutton.py +0 -0
  81. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/notebook.py +0 -0
  82. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/panedwindow.py +0 -0
  83. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/progressbar.py +0 -0
  84. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/radiobutton.py +0 -0
  85. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/registry.py +0 -0
  86. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/scale.py +0 -0
  87. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/scrollbar.py +0 -0
  88. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/separator.py +0 -0
  89. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/sizegrip.py +0 -0
  90. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/spinbox.py +0 -0
  91. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/toggle.py +0 -0
  92. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/toolbutton.py +0 -0
  93. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/treeview.py +0 -0
  94. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders/utils.py +0 -0
  95. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders_tk.py +0 -0
  96. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/builders_ttk.py +0 -0
  97. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/elements.py +0 -0
  98. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/engine.py +0 -0
  99. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/icons.py +0 -0
  100. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/layout.py +0 -0
  101. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/scaling.py +0 -0
  102. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/style/theme.py +0 -0
  103. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/themes/__init__.py +0 -0
  104. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/themes/builtin.py +0 -0
  105. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/themes/legacy.py +0 -0
  106. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/themes/standard.py +0 -0
  107. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utility.py +0 -0
  108. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/__init__.py +0 -0
  109. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/color.py +0 -0
  110. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/config.py +0 -0
  111. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/fonts.py +0 -0
  112. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/platform.py +0 -0
  113. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/utils/scaling.py +0 -0
  114. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/validation.py +0 -0
  115. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/__init__.py +0 -0
  116. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/dateentry.py +0 -0
  117. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/floodgauge.py +0 -0
  118. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/labeledscale.py +0 -0
  119. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/meter.py +0 -0
  120. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/scrolled.py +0 -0
  121. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/tableview.py +0 -0
  122. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/toast.py +0 -0
  123. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/widgets/tooltip.py +0 -0
  124. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap/window.py +0 -0
  125. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap.egg-info/dependency_links.txt +0 -0
  126. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap.egg-info/requires.txt +0 -0
  127. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkbootstrap.egg-info/top_level.txt +0 -0
  128. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkcreator/__init__.py +0 -0
  129. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/src/ttkcreator/__main__.py +0 -0
  130. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_bootstyle_grammar.py +0 -0
  131. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_bootstyle_value_tokens.py +0 -0
  132. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_busy_api.py +0 -0
  133. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_cli_api.py +0 -0
  134. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_config_api.py +0 -0
  135. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_configure_delegation.py +0 -0
  136. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_convert_theme.py +0 -0
  137. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_dateentry_api.py +0 -0
  138. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_dialogs_api.py +0 -0
  139. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_durable_style_options.py +0 -0
  140. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_filedialog_api.py +0 -0
  141. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_floodgauge_api.py +0 -0
  142. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_fonts_api.py +0 -0
  143. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_icon_drop.py +0 -0
  144. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_icon_theme.py +0 -0
  145. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_labeledscale_tooltip_api.py +0 -0
  146. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_menu_api.py +0 -0
  147. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_menu_border.py +0 -0
  148. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_meter_api.py +0 -0
  149. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_mixin_api.py +0 -0
  150. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_scaling.py +0 -0
  151. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_scroll_events.py +0 -0
  152. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_scrolled_api.py +0 -0
  153. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_style_package.py +0 -0
  154. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_style_reference.py +0 -0
  155. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_surface_color.py +0 -0
  156. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_surface_families.py +0 -0
  157. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_surface_grammar.py +0 -0
  158. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_tableview_api.py +0 -0
  159. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_toast_api.py +0 -0
  160. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_toolkit.py +0 -0
  161. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_treeview_rowheight.py +0 -0
  162. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_utility_api.py +0 -0
  163. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_widget_catalog_coverage.py +0 -0
  164. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_widget_reexports.py +0 -0
  165. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/tests/test_widget_stubs.py +0 -0
  166. {ttkbootstrap-2.2.2 → ttkbootstrap-2.2.3}/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.2
3
+ Version: 2.2.3
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)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ttkbootstrap"
7
- version = "2.2.2"
7
+ version = "2.2.3"
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"
@@ -56,6 +56,11 @@ Documentation = "https://www.ttkbootstrap.org/en/latest/"
56
56
  ttkbootstrap = "ttkbootstrap.cli:main"
57
57
  ttkb = "ttkbootstrap.cli:main"
58
58
 
59
+ [project.entry-points."pyinstaller40"]
60
+ # Include a hook to add the data files to a PyInstaller bundle
61
+ # https://pyinstaller.org/en/stable/hooks.html#providing-pyinstaller-hooks-with-your-package
62
+ hook-dirs = "ttkbootstrap._pyinstaller:get_hook_dirs"
63
+
59
64
  [tool.setuptools.packages.find]
60
65
  where = ["src"]
61
66
 
@@ -67,7 +72,9 @@ where = ["src"]
67
72
  # graft already sweeps them in, but the stub is what restores widget parameters
68
73
  # in an IDE (#1327), so a wheel that quietly ships without it is a silent
69
74
  # regression rather than a visible failure.
70
- "ttkbootstrap" = ["py.typed", "*.pyi", "themes/*.json", "assets/*", "assets/icons/*", "assets/elements/*", "assets/app_icons/ttkbootstrap.ico", "assets/app_icons/ttkbootstrap.png"]
75
+ "ttkbootstrap" = [
76
+ "py.typed", "*.pyi", "themes/*.json", "assets/*", "assets/icons/*", "assets/elements/*",
77
+ "assets/app_icons/ttkbootstrap.ico", "assets/app_icons/ttkbootstrap.png", "_pyinstaller/*.py"]
71
78
 
72
79
  [tool.pytest.ini_options]
73
80
  # Only the headless suite under tests/ is collected. Interactive mainloop()
@@ -0,0 +1,8 @@
1
+ """Pyinstaller hook to include static assets"""
2
+
3
+ import os
4
+
5
+
6
+ def get_hook_dirs() -> list[str]:
7
+ """Returns the absolute path of this directory to PyInstaller."""
8
+ return [os.path.dirname(__file__)]
@@ -0,0 +1,3 @@
1
+ from PyInstaller.utils.hooks import collect_data_files
2
+
3
+ datas = collect_data_files("ttkbootstrap.assets")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttkbootstrap
3
- Version: 2.2.2
3
+ Version: 2.2.3
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)
@@ -21,6 +21,8 @@ src/ttkbootstrap.egg-info/dependency_links.txt
21
21
  src/ttkbootstrap.egg-info/entry_points.txt
22
22
  src/ttkbootstrap.egg-info/requires.txt
23
23
  src/ttkbootstrap.egg-info/top_level.txt
24
+ src/ttkbootstrap/_pyinstaller/__init__.py
25
+ src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py
24
26
  src/ttkbootstrap/assets/__init__.py
25
27
  src/ttkbootstrap/assets/app_icons/ttkbootstrap.ico
26
28
  src/ttkbootstrap/assets/app_icons/ttkbootstrap.png
@@ -142,6 +144,7 @@ tests/test_menu_api.py
142
144
  tests/test_menu_border.py
143
145
  tests/test_meter_api.py
144
146
  tests/test_mixin_api.py
147
+ tests/test_pyinstaller_hook.py
145
148
  tests/test_scaling.py
146
149
  tests/test_scroll_events.py
147
150
  tests/test_scrolled_api.py
@@ -1,3 +1,6 @@
1
1
  [console_scripts]
2
2
  ttkb = ttkbootstrap.cli:main
3
3
  ttkbootstrap = ttkbootstrap.cli:main
4
+
5
+ [pyinstaller40]
6
+ hook-dirs = ttkbootstrap._pyinstaller:get_hook_dirs
@@ -0,0 +1,51 @@
1
+ """Tests for the PyInstaller hook that bundles ttkbootstrap's package data.
2
+
3
+ The icon font and the element rasters are package *data*, which a freezer
4
+ collects only when a hook names it. A broken hook is invisible until someone
5
+ runs the frozen app, which then dies at its first icon render -- so these tests
6
+ pin every link PyInstaller follows, without needing PyInstaller installed.
7
+ """
8
+ import ast
9
+ import importlib.metadata
10
+ from pathlib import Path
11
+
12
+ from ttkbootstrap._pyinstaller import get_hook_dirs
13
+
14
+ HOOK_GROUP = "pyinstaller40"
15
+ TARGET = "ttkbootstrap._pyinstaller:get_hook_dirs"
16
+
17
+
18
+ def _hook_path():
19
+ return Path(get_hook_dirs()[0]) / "hook-ttkbootstrap.py"
20
+
21
+
22
+ def test_hook_dirs_name_the_directory_holding_the_hook():
23
+ dirs = get_hook_dirs()
24
+ assert len(dirs) == 1
25
+ assert _hook_path().is_file()
26
+
27
+
28
+ def test_entry_point_is_installed_and_resolves():
29
+ # Selected by value, not name: PyInstaller's own contrib package registers a
30
+ # `hook-dirs` entry point in the same group.
31
+ ours = [ep for ep in importlib.metadata.entry_points(group=HOOK_GROUP)
32
+ if ep.value == TARGET]
33
+ assert ours, "no pyinstaller40 entry point -- reinstall with `pip install -e .`"
34
+ assert ours[0].load()() == get_hook_dirs()
35
+
36
+
37
+ def test_hook_assigns_the_collected_data_to_datas():
38
+ # PyInstaller reads only the hook's `datas` global. Calling
39
+ # collect_data_files without assigning it collects nothing, and a text
40
+ # search for the call cannot tell the difference -- so parse the file.
41
+ tree = ast.parse(_hook_path().read_text(encoding="utf-8-sig"))
42
+ collected = [
43
+ node.value.args[0].value
44
+ for node in tree.body
45
+ if isinstance(node, ast.Assign)
46
+ 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"]
File without changes
File without changes
File without changes
File without changes