bootstack 0.1.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. bootstack/__init__.py +249 -0
  2. bootstack/__main__.py +5 -0
  3. bootstack/api/__init__.py +127 -0
  4. bootstack/api/app.py +30 -0
  5. bootstack/api/constants.py +3 -0
  6. bootstack/api/data.py +23 -0
  7. bootstack/api/dialogs.py +44 -0
  8. bootstack/api/i18n.py +17 -0
  9. bootstack/api/localization.py +16 -0
  10. bootstack/api/menu.py +7 -0
  11. bootstack/api/style.py +23 -0
  12. bootstack/api/utils.py +24 -0
  13. bootstack/api/widgets.py +137 -0
  14. bootstack/assets/__init__.py +24 -0
  15. bootstack/assets/bootstack-transparent.png +0 -0
  16. bootstack/assets/bootstack.ico +0 -0
  17. bootstack/assets/bootstack.png +0 -0
  18. bootstack/assets/elements/__init__.py +0 -0
  19. bootstack/assets/elements/badge-pill.png +0 -0
  20. bootstack/assets/elements/badge-square.png +0 -0
  21. bootstack/assets/elements/border.png +0 -0
  22. bootstack/assets/elements/button-compact.png +0 -0
  23. bootstack/assets/elements/button-default.png +0 -0
  24. bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
  25. bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
  26. bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
  27. bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
  28. bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
  29. bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
  30. bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
  31. bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
  32. bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
  33. bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
  34. bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
  35. bootstack/assets/elements/button-group-vertical-center-default.png +0 -0
  36. bootstack/assets/elements/checkbox-checked.png +0 -0
  37. bootstack/assets/elements/checkbox-indeterminate.png +0 -0
  38. bootstack/assets/elements/checkbox-unchecked.png +0 -0
  39. bootstack/assets/elements/field.png +0 -0
  40. bootstack/assets/elements/input-after-compact.png +0 -0
  41. bootstack/assets/elements/input-after-default.png +0 -0
  42. bootstack/assets/elements/input-before-compact.png +0 -0
  43. bootstack/assets/elements/input-before-default.png +0 -0
  44. bootstack/assets/elements/input-compact.png +0 -0
  45. bootstack/assets/elements/input-default.png +0 -0
  46. bootstack/assets/elements/list-item-separated.png +0 -0
  47. bootstack/assets/elements/list-item.png +0 -0
  48. bootstack/assets/elements/manifest.toml +480 -0
  49. bootstack/assets/elements/menu-item.png +0 -0
  50. bootstack/assets/elements/nav-button-compact.png +0 -0
  51. bootstack/assets/elements/nav-button-default.png +0 -0
  52. bootstack/assets/elements/nav-icon-button-compact.png +0 -0
  53. bootstack/assets/elements/nav-icon-button-default.png +0 -0
  54. bootstack/assets/elements/notebook-client-border.png +0 -0
  55. bootstack/assets/elements/notebook-tab-active.png +0 -0
  56. bootstack/assets/elements/notebook-tab-bar.png +0 -0
  57. bootstack/assets/elements/notebook-tab-normal.png +0 -0
  58. bootstack/assets/elements/notebook-tab-pill.png +0 -0
  59. bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
  60. bootstack/assets/elements/progress-bar-solid.png +0 -0
  61. bootstack/assets/elements/progress-bar-thin.png +0 -0
  62. bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
  63. bootstack/assets/elements/radio-selected.png +0 -0
  64. bootstack/assets/elements/radio-unselected.png +0 -0
  65. bootstack/assets/elements/scrollbar-horizontal.png +0 -0
  66. bootstack/assets/elements/scrollbar-vertical.png +0 -0
  67. bootstack/assets/elements/slider-handle-focus.png +0 -0
  68. bootstack/assets/elements/slider-handle.png +0 -0
  69. bootstack/assets/elements/slider-track-horizontal.png +0 -0
  70. bootstack/assets/elements/slider-track-vertical.png +0 -0
  71. bootstack/assets/elements/switch-off.png +0 -0
  72. bootstack/assets/elements/switch-on.png +0 -0
  73. bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
  74. bootstack/assets/elements/tabs-bar-vertical.png +0 -0
  75. bootstack/assets/elements/tabs-pill.png +0 -0
  76. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
  77. bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +853 -0
  78. bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +875 -0
  79. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
  80. bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +853 -0
  81. bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
  82. bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +853 -0
  83. bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
  84. bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +853 -0
  85. bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
  86. bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +875 -0
  87. bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
  88. bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +853 -0
  89. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
  90. bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +853 -0
  91. bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
  92. bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +851 -0
  93. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
  94. bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +842 -0
  95. bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
  96. bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +841 -0
  97. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
  98. bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +914 -0
  99. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
  100. bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +842 -0
  101. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
  102. bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +841 -0
  103. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
  104. bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +841 -0
  105. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
  106. bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +842 -0
  107. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
  108. bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +842 -0
  109. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
  110. bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +842 -0
  111. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
  112. bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +842 -0
  113. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
  114. bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +842 -0
  115. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
  116. bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +842 -0
  117. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
  118. bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +842 -0
  119. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
  120. bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +842 -0
  121. bootstack/assets/themes/__init__.py +0 -0
  122. bootstack/assets/themes/amber-dark.json +32 -0
  123. bootstack/assets/themes/amber-light.json +32 -0
  124. bootstack/assets/themes/aurora-dark.json +32 -0
  125. bootstack/assets/themes/aurora-light.json +32 -0
  126. bootstack/assets/themes/bootstrap-dark.json +32 -0
  127. bootstack/assets/themes/bootstrap-light.json +32 -0
  128. bootstack/assets/themes/classic-dark.json +32 -0
  129. bootstack/assets/themes/classic-light.json +32 -0
  130. bootstack/assets/themes/docs-dark.json +32 -0
  131. bootstack/assets/themes/docs-light.json +32 -0
  132. bootstack/assets/themes/forest-dark.json +32 -0
  133. bootstack/assets/themes/forest-light.json +32 -0
  134. bootstack/assets/themes/ocean-dark.json +32 -0
  135. bootstack/assets/themes/ocean-light.json +32 -0
  136. bootstack/assets/themes/rose-dark.json +32 -0
  137. bootstack/assets/themes/rose-light.json +32 -0
  138. bootstack/assets/widgets/__init__.py +0 -0
  139. bootstack/assets/widgets/badge-default.png +0 -0
  140. bootstack/assets/widgets/badge-pill.png +0 -0
  141. bootstack/assets/widgets/border.png +0 -0
  142. bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
  143. bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
  144. bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
  145. bootstack/assets/widgets/button-group-vertical-after.png +0 -0
  146. bootstack/assets/widgets/button-group-vertical-before.png +0 -0
  147. bootstack/assets/widgets/button-group-vertical-center.png +0 -0
  148. bootstack/assets/widgets/button.png +0 -0
  149. bootstack/assets/widgets/checkbox-checked.png +0 -0
  150. bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
  151. bootstack/assets/widgets/checkbox-unchecked.png +0 -0
  152. bootstack/assets/widgets/field.png +0 -0
  153. bootstack/assets/widgets/icon-button.png +0 -0
  154. bootstack/assets/widgets/input-inner.png +0 -0
  155. bootstack/assets/widgets/input-prefix.png +0 -0
  156. bootstack/assets/widgets/input-suffix.png +0 -0
  157. bootstack/assets/widgets/input.png +0 -0
  158. bootstack/assets/widgets/list-item-focus.png +0 -0
  159. bootstack/assets/widgets/list-item-separated.png +0 -0
  160. bootstack/assets/widgets/menu-item-separated.png +0 -0
  161. bootstack/assets/widgets/notebook-client-border.png +0 -0
  162. bootstack/assets/widgets/notebook-pill-active.png +0 -0
  163. bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
  164. bootstack/assets/widgets/notebook-tab-active.png +0 -0
  165. bootstack/assets/widgets/notebook-tab-border.png +0 -0
  166. bootstack/assets/widgets/notebook-tab-normal.png +0 -0
  167. bootstack/assets/widgets/notebook-underline.png +0 -0
  168. bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
  169. bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
  170. bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
  171. bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
  172. bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
  173. bootstack/assets/widgets/progress-trough-vertical.png +0 -0
  174. bootstack/assets/widgets/radio-selected.png +0 -0
  175. bootstack/assets/widgets/radio-unselected.png +0 -0
  176. bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
  177. bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
  178. bootstack/assets/widgets/separator-horizontal.png +0 -0
  179. bootstack/assets/widgets/separator-vertical.png +0 -0
  180. bootstack/assets/widgets/slider-handle-focus.png +0 -0
  181. bootstack/assets/widgets/slider-handle.png +0 -0
  182. bootstack/assets/widgets/slider-track-horizontal.png +0 -0
  183. bootstack/assets/widgets/slider-track-vertical.png +0 -0
  184. bootstack/assets/widgets/switch-off.png +0 -0
  185. bootstack/assets/widgets/switch-on.png +0 -0
  186. bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
  187. bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
  188. bootstack/assets/widgets/tabs-pill.png +0 -0
  189. bootstack/cli/__init__.py +124 -0
  190. bootstack/cli/__main__.py +6 -0
  191. bootstack/cli/add.py +439 -0
  192. bootstack/cli/build.py +115 -0
  193. bootstack/cli/config.py +287 -0
  194. bootstack/cli/demo.py +1267 -0
  195. bootstack/cli/doctor.py +195 -0
  196. bootstack/cli/list_cmd.py +71 -0
  197. bootstack/cli/promote.py +120 -0
  198. bootstack/cli/pyinstaller.py +246 -0
  199. bootstack/cli/run.py +99 -0
  200. bootstack/cli/start.py +105 -0
  201. bootstack/cli/templates/__init__.py +861 -0
  202. bootstack/constants.py +325 -0
  203. bootstack/core/__init__.py +34 -0
  204. bootstack/core/capabilities/__init__.py +45 -0
  205. bootstack/core/capabilities/after.py +103 -0
  206. bootstack/core/capabilities/bind.py +154 -0
  207. bootstack/core/capabilities/bindtags.py +112 -0
  208. bootstack/core/capabilities/busy.py +61 -0
  209. bootstack/core/capabilities/clipboard.py +88 -0
  210. bootstack/core/capabilities/focus.py +118 -0
  211. bootstack/core/capabilities/grab.py +65 -0
  212. bootstack/core/capabilities/grid.py +188 -0
  213. bootstack/core/capabilities/localization.py +231 -0
  214. bootstack/core/capabilities/pack.py +119 -0
  215. bootstack/core/capabilities/place.py +92 -0
  216. bootstack/core/capabilities/selection.py +136 -0
  217. bootstack/core/capabilities/signals.py +242 -0
  218. bootstack/core/capabilities/winfo.py +315 -0
  219. bootstack/core/colorutils.py +234 -0
  220. bootstack/core/exceptions.py +95 -0
  221. bootstack/core/images.py +283 -0
  222. bootstack/core/localization/README.md +90 -0
  223. bootstack/core/localization/__init__.py +13 -0
  224. bootstack/core/localization/intl_format.py +580 -0
  225. bootstack/core/localization/msgcat.py +425 -0
  226. bootstack/core/localization/specs.py +143 -0
  227. bootstack/core/mixins/__init__.py +1 -0
  228. bootstack/core/mixins/ttk_state.py +35 -0
  229. bootstack/core/mixins/widget.py +132 -0
  230. bootstack/core/publisher.py +147 -0
  231. bootstack/core/signals/README.md +112 -0
  232. bootstack/core/signals/__init__.py +8 -0
  233. bootstack/core/signals/integration.py +100 -0
  234. bootstack/core/signals/signal.py +317 -0
  235. bootstack/core/signals/types.py +4 -0
  236. bootstack/core/validation/__init__.py +5 -0
  237. bootstack/core/validation/types.py +13 -0
  238. bootstack/core/validation/validation_result.py +17 -0
  239. bootstack/core/validation/validation_rules.py +112 -0
  240. bootstack/core/variables.py +62 -0
  241. bootstack/datasource/README.md +607 -0
  242. bootstack/datasource/__init__.py +51 -0
  243. bootstack/datasource/base.py +474 -0
  244. bootstack/datasource/file_source.py +541 -0
  245. bootstack/datasource/memory_source.py +482 -0
  246. bootstack/datasource/sqlite_source.py +453 -0
  247. bootstack/datasource/types.py +259 -0
  248. bootstack/dialogs/__init__.py +56 -0
  249. bootstack/dialogs/colorchooser.py +674 -0
  250. bootstack/dialogs/colordropper.py +257 -0
  251. bootstack/dialogs/datedialog.py +404 -0
  252. bootstack/dialogs/dialog.py +514 -0
  253. bootstack/dialogs/filterdialog.py +358 -0
  254. bootstack/dialogs/fontdialog.py +339 -0
  255. bootstack/dialogs/formdialog.py +541 -0
  256. bootstack/dialogs/message.py +489 -0
  257. bootstack/dialogs/query.py +561 -0
  258. bootstack/py.typed +1 -0
  259. bootstack/runtime/__init__.py +3 -0
  260. bootstack/runtime/app.py +879 -0
  261. bootstack/runtime/base_window.py +786 -0
  262. bootstack/runtime/events.py +399 -0
  263. bootstack/runtime/menu.py +510 -0
  264. bootstack/runtime/shortcuts.py +423 -0
  265. bootstack/runtime/tk_patch.py +31 -0
  266. bootstack/runtime/toplevel.py +131 -0
  267. bootstack/runtime/utility.py +371 -0
  268. bootstack/runtime/visual_focus.py +228 -0
  269. bootstack/runtime/window_utilities.py +1043 -0
  270. bootstack/style/__init__.py +5498 -0
  271. bootstack/style/bootstyle.py +507 -0
  272. bootstack/style/bootstyle_builder_base.py +752 -0
  273. bootstack/style/bootstyle_builder_mixed.py +93 -0
  274. bootstack/style/bootstyle_builder_tk.py +109 -0
  275. bootstack/style/bootstyle_builder_ttk.py +354 -0
  276. bootstack/style/builders/__init__.py +51 -0
  277. bootstack/style/builders/badge.py +44 -0
  278. bootstack/style/builders/button.py +453 -0
  279. bootstack/style/builders/buttongroup.py +344 -0
  280. bootstack/style/builders/calendar.py +271 -0
  281. bootstack/style/builders/checkbutton.py +95 -0
  282. bootstack/style/builders/combobox.py +112 -0
  283. bootstack/style/builders/contextmenu.py +268 -0
  284. bootstack/style/builders/entry.py +83 -0
  285. bootstack/style/builders/expander.py +171 -0
  286. bootstack/style/builders/field.py +312 -0
  287. bootstack/style/builders/frame.py +27 -0
  288. bootstack/style/builders/label.py +28 -0
  289. bootstack/style/builders/labelframe.py +41 -0
  290. bootstack/style/builders/listview.py +267 -0
  291. bootstack/style/builders/menubar.py +74 -0
  292. bootstack/style/builders/menubutton.py +408 -0
  293. bootstack/style/builders/notebook.py +316 -0
  294. bootstack/style/builders/panedwindow.py +25 -0
  295. bootstack/style/builders/progressbar.py +71 -0
  296. bootstack/style/builders/radiobutton.py +68 -0
  297. bootstack/style/builders/scale.py +66 -0
  298. bootstack/style/builders/scrollbar.py +360 -0
  299. bootstack/style/builders/separator.py +45 -0
  300. bootstack/style/builders/sidenav.py +313 -0
  301. bootstack/style/builders/sizegrip.py +15 -0
  302. bootstack/style/builders/spinbox.py +119 -0
  303. bootstack/style/builders/switch.py +67 -0
  304. bootstack/style/builders/tabitem.py +205 -0
  305. bootstack/style/builders/toolbutton.py +260 -0
  306. bootstack/style/builders/tooltip.py +26 -0
  307. bootstack/style/builders/treeview.py +269 -0
  308. bootstack/style/builders/utils.py +404 -0
  309. bootstack/style/builders_tk/__init__.py +16 -0
  310. bootstack/style/builders_tk/defaults.py +229 -0
  311. bootstack/style/element.py +173 -0
  312. bootstack/style/style.py +499 -0
  313. bootstack/style/theme_provider.py +449 -0
  314. bootstack/style/tk_patch.py +5 -0
  315. bootstack/style/token_maps.py +42 -0
  316. bootstack/style/types.py +32 -0
  317. bootstack/style/typography.py +527 -0
  318. bootstack/style/utility.py +696 -0
  319. bootstack/themes/__init__.py +12 -0
  320. bootstack/themes/standard.py +415 -0
  321. bootstack/themes/user.py +45 -0
  322. bootstack/widgets/__init__.py +53 -0
  323. bootstack/widgets/composites/__init__.py +38 -0
  324. bootstack/widgets/composites/accordion.py +385 -0
  325. bootstack/widgets/composites/appshell.py +445 -0
  326. bootstack/widgets/composites/buttongroup.py +391 -0
  327. bootstack/widgets/composites/calendar.py +914 -0
  328. bootstack/widgets/composites/compositeframe.py +282 -0
  329. bootstack/widgets/composites/contextmenu.py +1754 -0
  330. bootstack/widgets/composites/dateentry.py +261 -0
  331. bootstack/widgets/composites/dropdownbutton.py +190 -0
  332. bootstack/widgets/composites/expander.py +508 -0
  333. bootstack/widgets/composites/field.py +448 -0
  334. bootstack/widgets/composites/floodgauge.py +434 -0
  335. bootstack/widgets/composites/form.py +983 -0
  336. bootstack/widgets/composites/labeledscale.py +209 -0
  337. bootstack/widgets/composites/list/__init__.py +15 -0
  338. bootstack/widgets/composites/list/listitem.py +733 -0
  339. bootstack/widgets/composites/list/listview.py +1507 -0
  340. bootstack/widgets/composites/menubar.py +303 -0
  341. bootstack/widgets/composites/meter.py +882 -0
  342. bootstack/widgets/composites/numericentry.py +183 -0
  343. bootstack/widgets/composites/pagestack.py +330 -0
  344. bootstack/widgets/composites/passwordentry.py +149 -0
  345. bootstack/widgets/composites/pathentry.py +223 -0
  346. bootstack/widgets/composites/radiogroup.py +466 -0
  347. bootstack/widgets/composites/scrolledtext.py +388 -0
  348. bootstack/widgets/composites/scrolledtext.pyi +186 -0
  349. bootstack/widgets/composites/scrollview.py +675 -0
  350. bootstack/widgets/composites/selectbox.py +544 -0
  351. bootstack/widgets/composites/sidenav/__init__.py +24 -0
  352. bootstack/widgets/composites/sidenav/group.py +485 -0
  353. bootstack/widgets/composites/sidenav/header.py +83 -0
  354. bootstack/widgets/composites/sidenav/item.py +413 -0
  355. bootstack/widgets/composites/sidenav/separator.py +51 -0
  356. bootstack/widgets/composites/sidenav/view.py +919 -0
  357. bootstack/widgets/composites/spinnerentry.py +232 -0
  358. bootstack/widgets/composites/tableview/__init__.py +5 -0
  359. bootstack/widgets/composites/tableview/tableview.py +2254 -0
  360. bootstack/widgets/composites/tableview/types.py +169 -0
  361. bootstack/widgets/composites/tabs/__init__.py +6 -0
  362. bootstack/widgets/composites/tabs/tabitem.py +372 -0
  363. bootstack/widgets/composites/tabs/tabs.py +478 -0
  364. bootstack/widgets/composites/tabs/tabview.py +352 -0
  365. bootstack/widgets/composites/textentry.py +90 -0
  366. bootstack/widgets/composites/timeentry.py +189 -0
  367. bootstack/widgets/composites/toast.py +364 -0
  368. bootstack/widgets/composites/togglegroup.py +382 -0
  369. bootstack/widgets/composites/toolbar.py +393 -0
  370. bootstack/widgets/composites/tooltip.py +404 -0
  371. bootstack/widgets/internal/__init__.py +0 -0
  372. bootstack/widgets/internal/wrapper_base.py +304 -0
  373. bootstack/widgets/mixins/__init__.py +25 -0
  374. bootstack/widgets/mixins/configure_mixin.py +186 -0
  375. bootstack/widgets/mixins/entry_mixin.py +70 -0
  376. bootstack/widgets/mixins/font_mixin.py +346 -0
  377. bootstack/widgets/mixins/icon_mixin.py +38 -0
  378. bootstack/widgets/mixins/localization_mixin.py +255 -0
  379. bootstack/widgets/mixins/signal_mixin.py +272 -0
  380. bootstack/widgets/mixins/validation_mixin.py +204 -0
  381. bootstack/widgets/parts/__init__.py +11 -0
  382. bootstack/widgets/parts/numberentry_part.py +345 -0
  383. bootstack/widgets/parts/spinnerentry_part.py +394 -0
  384. bootstack/widgets/parts/textentry_part.py +344 -0
  385. bootstack/widgets/primitives/__init__.py +55 -0
  386. bootstack/widgets/primitives/badge.py +44 -0
  387. bootstack/widgets/primitives/button.py +89 -0
  388. bootstack/widgets/primitives/card.py +66 -0
  389. bootstack/widgets/primitives/checkbutton.py +124 -0
  390. bootstack/widgets/primitives/checktoggle.py +53 -0
  391. bootstack/widgets/primitives/combobox.py +165 -0
  392. bootstack/widgets/primitives/entry.py +98 -0
  393. bootstack/widgets/primitives/frame.py +206 -0
  394. bootstack/widgets/primitives/gridframe.py +479 -0
  395. bootstack/widgets/primitives/label.py +95 -0
  396. bootstack/widgets/primitives/labelframe.py +63 -0
  397. bootstack/widgets/primitives/menubutton.py +118 -0
  398. bootstack/widgets/primitives/notebook.py +551 -0
  399. bootstack/widgets/primitives/optionmenu.py +248 -0
  400. bootstack/widgets/primitives/packframe.py +228 -0
  401. bootstack/widgets/primitives/panedwindow.py +58 -0
  402. bootstack/widgets/primitives/progressbar.py +95 -0
  403. bootstack/widgets/primitives/radiobutton.py +115 -0
  404. bootstack/widgets/primitives/radiotoggle.py +50 -0
  405. bootstack/widgets/primitives/scale.py +85 -0
  406. bootstack/widgets/primitives/scrollbar.py +56 -0
  407. bootstack/widgets/primitives/separator.py +56 -0
  408. bootstack/widgets/primitives/sizegrip.py +47 -0
  409. bootstack/widgets/primitives/spinbox.py +91 -0
  410. bootstack/widgets/primitives/switch.py +41 -0
  411. bootstack/widgets/primitives/treeview.py +77 -0
  412. bootstack/widgets/types.py +20 -0
  413. bootstack-0.1.0a1.dist-info/METADATA +196 -0
  414. bootstack-0.1.0a1.dist-info/RECORD +419 -0
  415. bootstack-0.1.0a1.dist-info/WHEEL +5 -0
  416. bootstack-0.1.0a1.dist-info/entry_points.txt +2 -0
  417. bootstack-0.1.0a1.dist-info/licenses/LICENSE +22 -0
  418. bootstack-0.1.0a1.dist-info/licenses/NOTICE +10 -0
  419. bootstack-0.1.0a1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,132 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Mapping, Any
4
+
5
+ from bootstack.core.capabilities.after import AfterMixin
6
+ from bootstack.core.capabilities.bind import BindingsMixin
7
+ from bootstack.core.capabilities.bindtags import BindtagsMixin
8
+ from bootstack.core.capabilities.clipboard import ClipboardMixin
9
+ from bootstack.core.capabilities.focus import FocusMixin
10
+ from bootstack.core.capabilities.grab import GrabMixin
11
+ from bootstack.core.capabilities.grid import GridMixin
12
+ from bootstack.core.capabilities.pack import PackMixin
13
+ from bootstack.core.capabilities.place import PlaceMixin
14
+ from bootstack.core.capabilities.selection import SelectionMixin
15
+ from bootstack.core.capabilities.winfo import WinfoMixin
16
+
17
+
18
+ class WidgetCapabilitiesMixin(
19
+ AfterMixin,
20
+ BindingsMixin,
21
+ BindtagsMixin,
22
+ ClipboardMixin,
23
+ FocusMixin,
24
+ GrabMixin,
25
+ GridMixin,
26
+ PackMixin,
27
+ PlaceMixin,
28
+ SelectionMixin,
29
+ WinfoMixin,
30
+ ):
31
+ """Common widget API surface (tk + ttk).
32
+
33
+ This mixin aggregates documented capability mixins into a single interface
34
+ suitable for both Tk and ttk widgets, plus a small set of commonly used
35
+ widget operations (configure/cget/destroy, stacking order, etc.).
36
+ """
37
+
38
+ # -------------------------------------------------------------------------
39
+ # Lifecycle
40
+ # -------------------------------------------------------------------------
41
+
42
+ def destroy(self) -> None:
43
+ """Destroy this widget and release its Tk resources."""
44
+ return super().destroy() # type: ignore[misc]
45
+
46
+ # -------------------------------------------------------------------------
47
+ # Configuration
48
+ # -------------------------------------------------------------------------
49
+
50
+ def configure(self, cnf: Mapping[str, Any] | None = None, **kw: Any) -> Any:
51
+ """Configure widget options.
52
+
53
+ Args:
54
+ cnf: Optional mapping of option values.
55
+ **kw: Option values as keyword arguments.
56
+
57
+ Returns:
58
+ Tk returns configuration details when called with no args; otherwise
59
+ the return value is implementation-dependent.
60
+ """
61
+ if cnf is None:
62
+ return super().configure(**kw) # type: ignore[misc]
63
+ return super().configure(cnf, **kw) # type: ignore[misc]
64
+
65
+ config = configure
66
+
67
+ def cget(self, key: str) -> Any:
68
+ """Return the current value for an option.
69
+
70
+ Args:
71
+ key: Option name (with or without a leading dash).
72
+
73
+ Returns:
74
+ The option value.
75
+ """
76
+ return super().cget(key) # type: ignore[misc]
77
+
78
+ # -------------------------------------------------------------------------
79
+ # Stacking order
80
+ # -------------------------------------------------------------------------
81
+
82
+ def lift(self, aboveThis: Any | None = None) -> None:
83
+ """Raise this widget above its siblings.
84
+
85
+ Args:
86
+ aboveThis: Optional sibling widget to raise above.
87
+ """
88
+ return super().lift(aboveThis) # type: ignore[misc]
89
+
90
+ tkraise = lift
91
+
92
+ def lower(self, belowThis: Any | None = None) -> None:
93
+ """Lower this widget below its siblings.
94
+
95
+ Args:
96
+ belowThis: Optional sibling widget to lower below.
97
+ """
98
+ return super().lower(belowThis) # type: ignore[misc]
99
+
100
+ # -------------------------------------------------------------------------
101
+ # Layout convenience
102
+ # -------------------------------------------------------------------------
103
+
104
+ def forget(self) -> None:
105
+ """Remove the widget from layout (best-effort).
106
+
107
+ This calls the appropriate forget method depending on the active geometry manager:
108
+
109
+ - grid -> grid_forget()
110
+ - pack -> pack_forget()
111
+ - place -> place_forget()
112
+ """
113
+ try:
114
+ mgr = self.winfo_manager() # type: ignore[attr-defined]
115
+ except Exception:
116
+ mgr = ""
117
+
118
+ if mgr == "grid":
119
+ try:
120
+ self.grid_forget() # type: ignore[attr-defined]
121
+ except Exception:
122
+ pass
123
+ elif mgr == "pack":
124
+ try:
125
+ self.pack_forget() # type: ignore[attr-defined]
126
+ except Exception:
127
+ pass
128
+ elif mgr == "place":
129
+ try:
130
+ self.place_forget() # type: ignore[attr-defined]
131
+ except Exception:
132
+ pass
@@ -0,0 +1,147 @@
1
+ """Publisher-Subscriber pattern implementation for bootstack.
2
+
3
+ This module implements a simple publisher-subscriber (pub-sub) pattern used
4
+ for theme change notifications and widget updates throughout bootstack.
5
+
6
+ The Publisher class manages subscribers on different channels and broadcasts
7
+ messages to all subscribers when events occur (like theme changes).
8
+
9
+ Classes:
10
+ Channel: Enum defining subscriber channels (STD for tk, TTK for ttk)
11
+ Subscriber: Data class storing subscriber information
12
+ Publisher: Manages subscriptions and publishes messages to subscribers
13
+
14
+ Example:
15
+ ```python
16
+ from bootstack.publisher import Publisher, Channel
17
+
18
+ # Subscribe a function to theme changes
19
+ def on_theme_change():
20
+ print("Theme changed!")
21
+
22
+ Publisher.subscribe(
23
+ func=on_theme_change,
24
+ channel=Channel.TTK
25
+ )
26
+
27
+ # Publish a message to all TTK subscribers
28
+ Publisher.publish(Channel.TTK)
29
+ ```
30
+ """
31
+ from enum import Enum
32
+ from typing import List
33
+
34
+
35
+ class Channel(Enum):
36
+ """A grouping for Publisher subscribers. Indicates whether the
37
+ widget is a legacy `STD` tk widget or a styled `TTK` widget.
38
+
39
+ Attributes:
40
+
41
+ STD (1):
42
+ Legacy tkinter widgets.
43
+
44
+ TTK (2):
45
+ Themed tkinter widgets.
46
+ """
47
+
48
+ STD = 1
49
+ TTK = 2
50
+
51
+
52
+ class Subscriber:
53
+ """A subscriber data class used to store information about a specific
54
+ subscriber to the `Publisher`."""
55
+
56
+ def __init__(self, name, func, channel):
57
+ """Create a subscriber.
58
+
59
+ Parameters:
60
+
61
+ name (str):
62
+ The name of the subscriber
63
+
64
+ func (Callable):
65
+ The function to call when messaging.
66
+
67
+ channel (Channel):
68
+ The subscription channel.
69
+ """
70
+ self.name = name
71
+ self.func = func
72
+ self.channel = channel
73
+
74
+
75
+ class Publisher:
76
+ """Publish events to subscribed widgets for theme changes or configuration updates."""
77
+
78
+ __subscribers = {}
79
+
80
+ @staticmethod
81
+ def subscriber_count():
82
+ return len(Publisher.__subscribers)
83
+
84
+ @staticmethod
85
+ def subscribe(name, func, channel):
86
+ """Subscribe to an event.
87
+
88
+ Parameters:
89
+
90
+ name (str):
91
+ The widget's tkinter/tcl name.
92
+
93
+ func (Callable):
94
+ A function to call when passing a message.
95
+
96
+ channel (Channel):
97
+ Indicates the channel grouping the subscribers.
98
+ """
99
+ subs = Publisher.__subscribers
100
+ subs[name] = Subscriber(name, func, channel)
101
+
102
+ @staticmethod
103
+ def unsubscribe(name):
104
+ """Remove a subscriber.
105
+
106
+ Parameters:
107
+
108
+ name (str):
109
+ The widget's tkinter/tcl name.
110
+ """
111
+ subs = Publisher.__subscribers
112
+ try:
113
+ del subs[str(name)]
114
+ except:
115
+ pass
116
+
117
+ def get_subscribers(channel):
118
+ """Return a list of subscribers.
119
+
120
+ Returns:
121
+
122
+ List:
123
+ List of key-value tuples
124
+ """
125
+ subs = Publisher.__subscribers.values()
126
+ channel_subs = [s for s in subs if s.channel == channel]
127
+ return channel_subs
128
+
129
+ def publish_message(channel, *args):
130
+ """Publish a message to all subscribers.
131
+
132
+ Parameters:
133
+
134
+ channel (Channel):
135
+ The name of the channel to subscribe.
136
+
137
+ **args:
138
+ optional arguments to pass to the subscribers.
139
+ """
140
+ subs: list[Subscriber] = Publisher.get_subscribers(channel)
141
+ for sub in subs:
142
+ sub.func(*args)
143
+
144
+ @staticmethod
145
+ def clear_subscribers():
146
+ """Reset all subscriptions."""
147
+ Publisher.__subscribers.clear()
@@ -0,0 +1,112 @@
1
+ Signals for ttkbootstrap
2
+ ========================
3
+
4
+ Lightweight reactive state built on top of tkinter's ``Variable`` API.
5
+ Signals wrap a ``tk.Variable`` and provide a small, typed interface for
6
+ reading, writing, deriving, and subscribing to changes.
7
+
8
+ Architecture
9
+ - ``Signal[T]``: Generic wrapper around a ``tk.Variable`` with ``get()``,
10
+ ``set()``, ``subscribe()``, and ``map()``.
11
+ - ``_SignalTrace`` (internal): Manages Tcl traces for a variable
12
+ (``trace_add``/``trace_remove``).
13
+ - ``TraceOperation``: Literal type alias for trace operations
14
+ ("array", "read", "write", "unset").
15
+
16
+ Key behaviors
17
+ - Value access: ``signal()`` or ``signal.get()`` returns the current value;
18
+ ``signal.set(v)`` updates it. Signals can be passed directly to widget
19
+ options like ``textvariable``/``variable``; tkinter uses their Tcl name.
20
+ - Subscriptions: ``subscribe(cb, immediate=False)`` registers a callback and
21
+ returns a trace id. Multiple subscriptions of the same callback are supported.
22
+ Use ``unsubscribe(cb)`` to remove all subscriptions for that callback or
23
+ ``unsubscribe_all()`` to clear all.
24
+ - Derived signals: ``map(transform)`` creates a new signal that follows this
25
+ one using a transform function. A weak reference prevents the parent from
26
+ keeping derived signals alive unnecessarily.
27
+ - Robustness: The last known value is cached and returned if the underlying
28
+ Tcl variable is destroyed. Redundant updates are skipped when the new value
29
+ equals the current one. Exact type matching is enforced in ``set()``.
30
+
31
+ Usage
32
+ 1) Quick start
33
+ ```python
34
+ from ttkbootstrap.core.signals import Signal
35
+
36
+ count = Signal(0)
37
+ print(count.get()) # -> 0
38
+ count.set(1)
39
+ print(count()) # -> 1 (callable alias of get)
40
+ ```
41
+
42
+ 2) With widgets
43
+ ```python
44
+ import tkinter as tk
45
+ import ttkbootstrap as ttk
46
+ from ttkbootstrap.core.signals import Signal
47
+
48
+ root = ttk.Window()
49
+ name = Signal("")
50
+
51
+ entry = ttk.Entry(root, textvariable=name)
52
+ entry.pack()
53
+
54
+ label = ttk.Label(root)
55
+ label.pack()
56
+
57
+ name.subscribe(lambda v: label.configure(text=f"Hello, {v}!"), immediate=True)
58
+
59
+ root.mainloop()
60
+ ```
61
+
62
+ 3) Derived signals with ``map``
63
+ ```python
64
+ from ttkbootstrap.core.signals import Signal
65
+
66
+ price = Signal(10.0)
67
+ with_tax = price.map(lambda p: round(p * 1.07, 2))
68
+
69
+ with_tax.subscribe(lambda v: print("price with tax:", v), immediate=True)
70
+ price.set(12.0)
71
+ ```
72
+
73
+ 4) Wrap existing tkinter variables
74
+ ```python
75
+ import tkinter as tk
76
+ from ttkbootstrap.core.signals import Signal
77
+
78
+ root = tk.Tk()
79
+ tk_var = tk.IntVar(value=5)
80
+ sig = Signal.from_variable(tk_var)
81
+
82
+ sig.subscribe(print, immediate=True) # -> 5
83
+ tk_var.set(6) # prints 6
84
+ sig.set(7) # keeps both in sync
85
+ ```
86
+
87
+ 5) Multiple subscriptions and immediate firing
88
+ ```python
89
+ from ttkbootstrap.core.signals import Signal
90
+
91
+ flag = Signal(False)
92
+
93
+ fid1 = flag.subscribe(lambda v: print("A:", v), immediate=True)
94
+ fid2 = flag.subscribe(lambda v: print("B:", v))
95
+
96
+ flag.set(True) # triggers both
97
+
98
+ flag.unsubscribe(lambda v: print("B:", v)) # remove all B callbacks
99
+ ```
100
+
101
+ Import path
102
+ - Public API is re-exported at the package level:
103
+ - ``from ttkbootstrap.core.signals import Signal, TraceOperation``
104
+
105
+ Notes
106
+ - Tkinter is not thread-safe. Perform cross-thread updates using ``after``
107
+ on a Tk widget.
108
+ - Callbacks should be fast; long-running work should be scheduled off the UI
109
+ thread.
110
+ - Create ``Signal`` after you create the Tk/Window so the underlying
111
+ ``tk.Variable`` is attached to the same interpreter, or pass ``master=...``
112
+ when constructing ``Signal``.
@@ -0,0 +1,8 @@
1
+ """Reactive signal primitives for bootstack widgets."""
2
+ from .signal import Signal
3
+ from .types import TraceOperation
4
+
5
+ __all__ = [
6
+ "Signal",
7
+ "TraceOperation",
8
+ ]
@@ -0,0 +1,100 @@
1
+ """Integration helpers for using Signal with tkinter/ttk widgets.
2
+
3
+ Call `enable_widget_integration()` once early (after creating your Tk/Window)
4
+ to allow passing `Signal` objects directly to widget constructors and
5
+ `configure(...)` for options like `textvariable` and `variable`.
6
+
7
+ Without this, some environments/widgets may not coerce custom objects to the
8
+ required Tcl variable name automatically.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from typing import Any, Callable, Iterable, Tuple
14
+
15
+ import tkinter as tk
16
+ import tkinter.ttk as ttk
17
+
18
+
19
+ def _is_signal(obj: Any) -> bool:
20
+ try:
21
+ # Cheap duck-typing to avoid hard import dependency
22
+ m = type(obj).__module__
23
+ return (
24
+ (m.startswith("bootstack.signals") or m.startswith("bootstack.core.signals"))
25
+ and hasattr(obj, "name")
26
+ and hasattr(obj, "var")
27
+ )
28
+ except Exception:
29
+ return False
30
+
31
+
32
+ def _coerce_kwargs(kwargs: dict[str, Any]) -> None:
33
+ for key in ("textvariable", "variable"):
34
+ if key in kwargs:
35
+ val = kwargs[key]
36
+ if _is_signal(val):
37
+ kwargs[key] = str(val)
38
+
39
+
40
+ def _wrap_init(cls: type) -> None:
41
+ orig_init = cls.__init__ # type: ignore[attr-defined]
42
+
43
+ def __init__(self, *args: Any, **kwargs: Any) -> None: # type: ignore[override]
44
+ _coerce_kwargs(kwargs)
45
+ orig_init(self, *args, **kwargs) # type: ignore[misc]
46
+
47
+ cls.__init__ = __init__ # type: ignore[assignment]
48
+
49
+
50
+ def _wrap_configure(cls: type) -> None:
51
+ orig_config = cls.configure # type: ignore[attr-defined]
52
+
53
+ def configure(self, cnf: Any = None, **kwargs: Any): # type: ignore[override]
54
+ if isinstance(cnf, dict):
55
+ _coerce_kwargs(cnf)
56
+ _coerce_kwargs(kwargs)
57
+ return orig_config(self, cnf, **kwargs) # type: ignore[misc]
58
+
59
+ cls.configure = configure # type: ignore[assignment]
60
+ cls.config = configure # type: ignore[assignment]
61
+
62
+
63
+ def _patch(classes: Iterable[type]) -> None:
64
+ for cls in classes:
65
+ _wrap_init(cls)
66
+ _wrap_configure(cls)
67
+
68
+
69
+ def enable_widget_integration() -> None:
70
+ """Enable passing `Signal` directly to widget options.
71
+
72
+ Patches common tk/ttk widget classes so that when you pass a `Signal`
73
+ instance to `textvariable` or `variable` in the constructor or in
74
+ `configure(...)`, it is automatically converted to its Tcl name.
75
+ """
76
+
77
+ ttk_classes: Tuple[type, ...] = (
78
+ ttk.Entry,
79
+ ttk.Label,
80
+ ttk.Button,
81
+ ttk.Checkbutton,
82
+ ttk.Radiobutton,
83
+ ttk.Combobox,
84
+ ttk.Spinbox,
85
+ ttk.Progressbar,
86
+ ttk.Scale,
87
+ ttk.OptionMenu,
88
+ )
89
+
90
+ tk_classes: Tuple[type, ...] = (
91
+ tk.Entry,
92
+ tk.Label,
93
+ tk.Button,
94
+ tk.Checkbutton,
95
+ tk.Radiobutton,
96
+ )
97
+
98
+ _patch(ttk_classes)
99
+ _patch(tk_classes)
100
+