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,112 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Sequence
4
+
5
+
6
+ class BindtagsMixin:
7
+ """Bindtags helpers (bindtags).
8
+
9
+ Bindtags control **the order in which Tk processes bindings** for an event.
10
+
11
+ Every widget has a list of bindtags. When an event occurs on a widget, Tk
12
+ processes bindings in tag order. Each tag may have bindings associated with it.
13
+
14
+ Typical default bindtags for a widget look like:
15
+
16
+ (widget_pathname, widget_class, toplevel_pathname, "all")
17
+
18
+ Practical uses:
19
+ - Insert a custom tag (e.g. "MyApp") to apply shared behaviors across widgets.
20
+ - Reorder tags to change precedence (e.g. run class bindings before widget bindings).
21
+ - Remove a tag to disable a layer of default behavior (use with care).
22
+
23
+ Notes:
24
+ - Bindtags affect event dispatch only; they do not change focus or grab behavior.
25
+ - Misordering tags can break default widget behaviors (Tab traversal, selection,
26
+ text editing, etc.), so keep changes minimal and well-scoped.
27
+ """
28
+
29
+ def bindtags(self, tags: Sequence[str] | None = None) -> tuple[str, ...]:
30
+ """Get or set the bindtags for this widget.
31
+
32
+ Args:
33
+ tags: The bindtags to set. If None, returns the current bindtags.
34
+ Tags are processed in order when dispatching events.
35
+
36
+ Returns:
37
+ The current bindtags as a tuple.
38
+ """
39
+ # Tkinter's `bindtags()` returns a tuple and accepts a sequence for setting.
40
+ if tags is None:
41
+ return super().bindtags() # type: ignore[misc]
42
+ return super().bindtags(tags) # type: ignore[misc]
43
+
44
+ # -------------------------------------------------------------------------
45
+ # Convenience helpers (optional)
46
+ # -------------------------------------------------------------------------
47
+
48
+ def bindtags_prepend(self, tag: str) -> tuple[str, ...]:
49
+ """Prepend a tag to the bindtags list.
50
+
51
+ This increases the tag's priority (it will be processed earlier).
52
+
53
+ Args:
54
+ tag: Tag name to prepend.
55
+
56
+ Returns:
57
+ The updated bindtags tuple.
58
+ """
59
+ current = list(self.bindtags())
60
+ if tag not in current:
61
+ current.insert(0, tag)
62
+ self.bindtags(current)
63
+ return tuple(current)
64
+
65
+ def bindtags_append(self, tag: str) -> tuple[str, ...]:
66
+ """Append a tag to the bindtags list.
67
+
68
+ This decreases the tag's priority (it will be processed later).
69
+
70
+ Args:
71
+ tag: Tag name to append.
72
+
73
+ Returns:
74
+ The updated bindtags tuple.
75
+ """
76
+ current = list(self.bindtags())
77
+ if tag not in current:
78
+ current.append(tag)
79
+ self.bindtags(current)
80
+ return tuple(current)
81
+
82
+ def bindtags_remove(self, tag: str) -> tuple[str, ...]:
83
+ """Remove a tag from the bindtags list.
84
+
85
+ Args:
86
+ tag: Tag name to remove.
87
+
88
+ Returns:
89
+ The updated bindtags tuple.
90
+ """
91
+ current = [t for t in self.bindtags() if t != tag]
92
+ self.bindtags(current)
93
+ return tuple(current)
94
+
95
+ def bindtags_replace(self, old: str, new: str) -> tuple[str, ...]:
96
+ """Replace a bindtag with another tag.
97
+
98
+ Args:
99
+ old: Existing tag name.
100
+ new: Replacement tag name.
101
+
102
+ Returns:
103
+ The updated bindtags tuple.
104
+ """
105
+ current = list(self.bindtags())
106
+ try:
107
+ idx = current.index(old)
108
+ except ValueError:
109
+ return tuple(current)
110
+ current[idx] = new
111
+ self.bindtags(current)
112
+ return tuple(current)
@@ -0,0 +1,61 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+
6
+ class BusyMixin:
7
+ """Busy (input-blocking) helpers (busy).
8
+
9
+ Tk’s *busy* facility blocks pointer events from reaching a widget/window by
10
+ placing an input-only window above it. This is typically used to prevent
11
+ user interaction during a long-running operation (e.g., loading, saving).
12
+
13
+ Notes:
14
+ - Busy blocks pointer events; it does not guarantee keyboard events are blocked.
15
+ - Always release busy state in a `finally:` block (or use a context manager).
16
+ """
17
+
18
+ def busy_hold(self, **kw: Any) -> None:
19
+ """Activate busy mode for this widget/window.
20
+
21
+ While busy is active, pointer events are intercepted so the user cannot
22
+ interact with the target window (and typically its children).
23
+
24
+ Args:
25
+ **kw: Busy options forwarded to Tk. Common options include `cursor`.
26
+ """
27
+ return super().busy_hold(**kw) # type: ignore[misc]
28
+
29
+ def busy_forget(self) -> None:
30
+ """Deactivate busy mode for this widget/window."""
31
+ return super().busy_forget() # type: ignore[misc]
32
+
33
+ def busy_status(self) -> bool:
34
+ """Return True if this widget/window is currently in busy mode."""
35
+ return bool(super().busy_status()) # type: ignore[misc]
36
+
37
+ def busy_configure(self, **kw: Any) -> Any:
38
+ """Query or configure busy options for this widget/window.
39
+
40
+ With no options, returns configuration information (format depends on Tk).
41
+ With options provided, updates the busy configuration.
42
+
43
+ Args:
44
+ **kw: Busy options forwarded to Tk.
45
+
46
+ Returns:
47
+ The raw Tk result for the configure query/set.
48
+ """
49
+ return super().busy_configure(**kw) # type: ignore[misc]
50
+
51
+ def busy_cget(self, option: str) -> Any:
52
+ """Return the current value of a single busy option.
53
+
54
+ Args:
55
+ option: Option name (e.g. "-cursor" or "cursor").
56
+
57
+ Returns:
58
+ The option value.
59
+ """
60
+ opt = option if option.startswith("-") else f"-{option}"
61
+ return super().busy_cget(opt) # type: ignore[misc]
@@ -0,0 +1,88 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+
6
+ class ClipboardMixin:
7
+ """Clipboard helpers (clipboard).
8
+
9
+ Tk’s `clipboard` command provides access to the system (or Tk-managed) clipboard.
10
+ Tkinter exposes this via the `clipboard_*` methods.
11
+
12
+ Notes:
13
+ - Clipboard behavior can vary by platform and window system.
14
+ - Most apps only need text clipboard operations (clear/append/get).
15
+ - For advanced cases (multiple clipboard types, non-text formats), Tk supports
16
+ additional options passed via keyword arguments.
17
+ """
18
+
19
+ def clipboard_clear(self, **kw: Any) -> None:
20
+ """Clear the clipboard on the target display.
21
+
22
+ This removes all data from the clipboard for the specified display.
23
+
24
+ Args:
25
+ **kw: Clipboard options forwarded to Tk. Common options include:
26
+ - displayof: A widget/window whose display should be targeted.
27
+ (Rarely needed in typical single-display apps.)
28
+ """
29
+ return super().clipboard_clear(**kw) # type: ignore[misc]
30
+
31
+ def clipboard_append(self, string: str, **kw: Any) -> None:
32
+ """Append text to the clipboard.
33
+
34
+ Appends *string* to the clipboard. If you want to replace clipboard contents,
35
+ call `clipboard_clear()` first and then `clipboard_append()`.
36
+
37
+ Args:
38
+ string: Text to append to the clipboard.
39
+ **kw: Clipboard options forwarded to Tk. Common options include:
40
+ - displayof: Target display for the clipboard.
41
+ - type: Clipboard type name (platform/window-system dependent).
42
+ - format: Data format name (platform/window-system dependent).
43
+
44
+ Example:
45
+ self.clipboard_clear()
46
+ self.clipboard_append("Hello, world!")
47
+ """
48
+ return super().clipboard_append(string, **kw) # type: ignore[misc]
49
+
50
+ def clipboard_get(self, **kw: Any) -> str:
51
+ """Return clipboard contents as text.
52
+
53
+ Args:
54
+ **kw: Clipboard options forwarded to Tk. Common options include:
55
+ - displayof: Target display for the clipboard.
56
+ - type: Clipboard type name (platform/window-system dependent).
57
+
58
+ Returns:
59
+ The clipboard contents as a string.
60
+
61
+ Raises:
62
+ tkinter.TclError: If the clipboard is empty or does not contain
63
+ data that can be converted to the requested type.
64
+ """
65
+ return super().clipboard_get(**kw) # type: ignore[misc]
66
+
67
+ # -------------------------------------------------------------------------
68
+ # Convenience helpers (optional): common "text clipboard" patterns
69
+ # -------------------------------------------------------------------------
70
+
71
+ def clipboard_set(self, text: str, **kw: Any) -> None:
72
+ """Replace clipboard contents with *text*.
73
+
74
+ This is a convenience wrapper for:
75
+
76
+ clipboard_clear(...)
77
+ clipboard_append(text, ...)
78
+
79
+ Args:
80
+ text: Text to set on the clipboard.
81
+ **kw: Clipboard options forwarded to `clipboard_clear` / `clipboard_append`.
82
+ """
83
+ self.clipboard_clear(**kw)
84
+ self.clipboard_append(text, **kw)
85
+
86
+ def clipboard_get_text(self, **kw: Any) -> str:
87
+ """Return clipboard contents as text (alias for `clipboard_get`)."""
88
+ return self.clipboard_get(**kw)
@@ -0,0 +1,118 @@
1
+ """Focus management capabilities mixin for bootstack widgets."""
2
+ from __future__ import annotations
3
+
4
+ from typing import Any
5
+
6
+
7
+ class FocusMixin:
8
+ """Keyboard focus helpers (focus).
9
+
10
+ Tk's *input focus* determines which widget receives key press/release events.
11
+ Focus is typically managed by the window manager at the top-level window level,
12
+ and then by the application within the top-level.
13
+
14
+ Tk remembers the most recent focused descendant for each top-level. When the
15
+ window manager gives focus to a top-level, Tk redirects it to that remembered
16
+ widget automatically.
17
+
18
+ Notes:
19
+ - Prefer `focus_set()` for normal use.
20
+ - `focus_force()` can steal focus and should be used sparingly.
21
+ - Tab/Shift-Tab traversal typically uses `tk_focusNext()` / `tk_focusPrev()`.
22
+ """
23
+
24
+ # -------------------------------------------------------------------------
25
+ # Core focus operations
26
+ # -------------------------------------------------------------------------
27
+
28
+ def focus_get(self) -> Any:
29
+ """Return the widget in this application that currently has focus.
30
+
31
+ This queries the focus window on the display containing the application's
32
+ main window. If no window in this application has focus on that display,
33
+ the return value is None / empty (depending on Tkinter/Tk behavior).
34
+
35
+ Returns:
36
+ The focused widget instance, or None if no widget in this application
37
+ currently has focus on the relevant display.
38
+ """
39
+ return super().focus_get() # type: ignore[misc]
40
+
41
+ def focus_set(self, *, visual_focus: bool = False) -> None:
42
+ """Request focus for this widget.
43
+
44
+ If this application currently has the focus on the widget's display, this
45
+ resets the focus for that display to this widget. Otherwise, Tk remembers
46
+ this widget as the focus for its top-level and will redirect focus to it
47
+ the next time the top-level receives focus.
48
+
49
+ Args:
50
+ visual_focus: If True, show focus ring as if focused via keyboard
51
+ (Tab navigation). Default is False, which shows no focus ring
52
+ for programmatic focus. Useful for validation errors where you
53
+ want to draw attention to a field.
54
+ """
55
+ return super().focus_set(visual_focus=visual_focus) # type: ignore[misc]
56
+
57
+ def focus_force(self, *, visual_focus: bool = False) -> None:
58
+ """Force focus to this widget (use sparingly).
59
+
60
+ This attempts to set the focus for the widget's display even if the
61
+ application does not currently have the input focus for that display.
62
+ In normal usage, applications should not claim focus; they should wait
63
+ for the window manager/user to give it focus.
64
+
65
+ Args:
66
+ visual_focus: If True, show focus ring as if focused via keyboard
67
+ (Tab navigation). Default is False, which shows no focus ring
68
+ for programmatic focus.
69
+ """
70
+ return super().focus_force(visual_focus=visual_focus) # type: ignore[misc]
71
+
72
+ def focus_displayof(self) -> Any:
73
+ """Return the focused widget for the display containing this widget.
74
+
75
+ If the focus window for this widget's display is not in this application,
76
+ the return value is None / empty (depending on Tkinter/Tk behavior).
77
+
78
+ Returns:
79
+ The focused widget instance for this display, or None.
80
+ """
81
+ return super().focus_displayof() # type: ignore[misc]
82
+
83
+ def focus_lastfor(self) -> Any:
84
+ """Return the most recent focused widget within this widget's top-level.
85
+
86
+ Tk tracks the most recent focus window for each top-level. This returns
87
+ the widget that will receive focus the next time the top-level gets focus
88
+ from the window manager. If none has ever had focus (or it was deleted),
89
+ Tk returns the top-level itself.
90
+
91
+ Returns:
92
+ The most recent focused widget in the same top-level, or the top-level.
93
+ """
94
+ return super().focus_lastfor() # type: ignore[misc]
95
+
96
+ # -------------------------------------------------------------------------
97
+ # Focus traversal (Tab order utilities)
98
+ # -------------------------------------------------------------------------
99
+
100
+ def tk_focusNext(self) -> Any:
101
+ """Return the next widget in the focus traversal order.
102
+
103
+ This is used by default bindings for Tab traversal in many Tk widgets.
104
+
105
+ Returns:
106
+ The next widget in focus order, or this widget if no other is eligible.
107
+ """
108
+ return super().tk_focusNext() # type: ignore[misc]
109
+
110
+ def tk_focusPrev(self) -> Any:
111
+ """Return the previous widget in the focus traversal order.
112
+
113
+ This is used by default bindings for Shift-Tab traversal in many Tk widgets.
114
+
115
+ Returns:
116
+ The previous widget in focus order, or this widget if no other is eligible.
117
+ """
118
+ return super().tk_focusPrev() # type: ignore[misc]
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+
6
+ class GrabMixin:
7
+ """Pointer/keyboard grab helpers (grab).
8
+
9
+ A *grab* confines mouse and keyboard events to a particular widget subtree.
10
+
11
+ When a grab is active:
12
+ - Pointer events are delivered only to the grab window and its descendants.
13
+ - Keyboard events are also directed to the grab window (effectively focusing input).
14
+ - This is the foundation for *modal* interactions (e.g., modal dialogs).
15
+
16
+ Tk supports two kinds of grabs:
17
+ - **Local (application) grab**: confines events within the current Tk application.
18
+ - **Global grab**: confines events at the window system level (more intrusive).
19
+
20
+ Notes:
21
+ - Grabs should be released when you are done (typically in a `finally:` block).
22
+ - Global grabs can make the entire desktop feel “stuck” if misused; prefer local grabs
23
+ unless you specifically need global behavior.
24
+ - A grab does not automatically make a window modal; typical modal patterns also:
25
+ `transient(parent)`, `focus_set()`, and `wait_window()` / `wait_visibility()`.
26
+ """
27
+
28
+ def grab_set(self) -> None:
29
+ """Set a local (application) grab on this widget.
30
+
31
+ With a local grab, events are confined within the current Tk application.
32
+ This is the preferred grab type for modal dialogs inside an application.
33
+ """
34
+ return super().grab_set() # type: ignore[misc]
35
+
36
+ def grab_set_global(self) -> None:
37
+ """Set a global grab on this widget.
38
+
39
+ A global grab confines events at the window system level. This is more
40
+ intrusive than a local grab and should be used with care.
41
+ """
42
+ return super().grab_set_global() # type: ignore[misc]
43
+
44
+ def grab_release(self) -> None:
45
+ """Release a grab held by this widget (if any)."""
46
+ return super().grab_release() # type: ignore[misc]
47
+
48
+ def grab_current(self) -> Any:
49
+ """Return the widget in this application that currently holds the grab.
50
+
51
+ Returns:
52
+ The widget instance that currently holds the grab, or None if
53
+ no grab is held by this application.
54
+ """
55
+ return super().grab_current() # type: ignore[misc]
56
+
57
+ def grab_status(self) -> str | None:
58
+ """Return the grab status for this widget.
59
+
60
+ Returns:
61
+ The grab status: "local" if this widget holds a local grab,
62
+ "global" if this widget holds a global grab, or None if
63
+ this widget does not hold the grab.
64
+ """
65
+ return super().grab_status() # type: ignore[misc]
@@ -0,0 +1,188 @@
1
+ """Grid geometry manager capabilities mixin for bootstack widgets."""
2
+ from __future__ import annotations
3
+
4
+ from typing import Any, TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from typing_extensions import Self
8
+
9
+
10
+ class GridMixin:
11
+ """Grid geometry manager helpers (grid).
12
+
13
+ Tk's `grid` geometry manager arranges widgets in a table of rows and columns.
14
+
15
+ In bootstack v2 you may prefer higher-level layout containers (e.g. `GridFrame`)
16
+ for most UI layout. This mixin documents the underlying Tkinter `grid_*` API
17
+ as an escape hatch and for interoperability with existing Tk code.
18
+
19
+ Notes:
20
+ - `grid()` attaches a widget to a parent container that is using grid.
21
+ - `rowconfigure()` / `columnconfigure()` set sizing behavior (weight/minsize/pad).
22
+ - `grid_propagate(False)` prevents a container from resizing to fit its children.
23
+ - If the parent has a `_on_child_grid` hook (e.g. GridFrame), layout defaults
24
+ are applied automatically.
25
+ """
26
+
27
+ # -------------------------------------------------------------------------
28
+ # Core widget methods
29
+ # -------------------------------------------------------------------------
30
+
31
+ def grid(self, cnf: dict[str, Any] | None = None, **kw: Any) -> Self:
32
+ """Position this widget using the grid geometry manager.
33
+
34
+ Args:
35
+ cnf: Optional dict of grid options.
36
+ **kw: Grid options. Common options include:
37
+ - row, column: Cell coordinates (0-based).
38
+ - rowspan, columnspan: Span across multiple cells.
39
+ - sticky: How the widget expands within its cell (e.g. "nsew").
40
+ - padx, pady: External padding around the widget.
41
+ - ipadx, ipady: Internal padding inside the widget.
42
+
43
+ Returns:
44
+ Self for method chaining.
45
+ """
46
+ options = cnf or {}
47
+ options.update(kw)
48
+
49
+ parent = self.master # type: ignore[attr-defined]
50
+ if hasattr(parent, '_on_child_grid'):
51
+ parent._on_child_grid(self, **options)
52
+ else:
53
+ super().grid(**options) # type: ignore[misc]
54
+ return self # type: ignore[return-value]
55
+
56
+ def grid_configure(self, cnf: dict[str, Any] | None = None, **kw: Any) -> Self:
57
+ """Alias for `grid()`.
58
+
59
+ Args:
60
+ cnf: Optional dict of grid options.
61
+ **kw: Grid options (see `grid`).
62
+
63
+ Returns:
64
+ Self for method chaining.
65
+ """
66
+ return self.grid(cnf, **kw)
67
+
68
+ def grid_forget(self) -> Self:
69
+ """Unmap this widget and forget its grid configuration.
70
+
71
+ The widget is removed from the layout, and its previous grid options
72
+ are discarded.
73
+
74
+ Returns:
75
+ Self for method chaining.
76
+ """
77
+ parent = self.master # type: ignore[attr-defined]
78
+ if hasattr(parent, '_on_child_grid_forget'):
79
+ parent._on_child_grid_forget(self)
80
+ else:
81
+ super().grid_forget() # type: ignore[misc]
82
+ return self # type: ignore[return-value]
83
+
84
+ def grid_remove(self) -> Self:
85
+ """Unmap this widget but remember its grid configuration.
86
+
87
+ Use `grid()` with no args to restore it to its previous grid location.
88
+
89
+ Returns:
90
+ Self for method chaining.
91
+ """
92
+ parent = self.master # type: ignore[attr-defined]
93
+ if hasattr(parent, '_on_child_grid_remove'):
94
+ parent._on_child_grid_remove(self)
95
+ else:
96
+ super().grid_remove() # type: ignore[misc]
97
+ return self # type: ignore[return-value]
98
+
99
+ def grid_info(self) -> dict[str, Any]:
100
+ """Return this widget's current grid configuration.
101
+
102
+ Returns:
103
+ A dict containing the current grid options for this widget
104
+ (row, column, sticky, padx, pady, etc.).
105
+ """
106
+ return super().grid_info() # type: ignore[misc]
107
+
108
+ # -------------------------------------------------------------------------
109
+ # Container methods (applied to the grid parent container)
110
+ # -------------------------------------------------------------------------
111
+
112
+ def grid_propagate(self, flag: bool | None = None) -> bool | None:
113
+ """Get or set grid geometry propagation for this container.
114
+
115
+ When propagation is enabled (default), the container may resize itself
116
+ to fit the size requests of its children.
117
+
118
+ Args:
119
+ flag: True/False to enable/disable propagation. If None, acts as a getter.
120
+
121
+ Returns:
122
+ When queried, returns the current propagation flag. When set, returns None.
123
+ """
124
+ return super().grid_propagate(flag) # type: ignore[misc]
125
+
126
+ def grid_rowconfigure(self, index: int, cnf: dict[str, Any] | None = None, **kw: Any) -> None:
127
+ """Configure sizing behavior for a grid row in this container.
128
+
129
+ Common options:
130
+ - weight: How extra space is distributed (0 means no expansion).
131
+ - minsize: Minimum row size in pixels.
132
+ - pad: Extra padding added to the row.
133
+
134
+ Args:
135
+ index: Row index (0-based).
136
+ cnf: Optional dict of configuration options.
137
+ **kw: Row configuration options.
138
+ """
139
+ if cnf is None:
140
+ return super().grid_rowconfigure(index, **kw) # type: ignore[misc]
141
+ return super().grid_rowconfigure(index, cnf, **kw) # type: ignore[misc]
142
+
143
+ def grid_columnconfigure(self, index: int, cnf: dict[str, Any] | None = None, **kw: Any) -> None:
144
+ """Configure sizing behavior for a grid column in this container.
145
+
146
+ Common options:
147
+ - weight: How extra space is distributed (0 means no expansion).
148
+ - minsize: Minimum column size in pixels.
149
+ - pad: Extra padding added to the column.
150
+
151
+ Args:
152
+ index: Column index (0-based).
153
+ cnf: Optional dict of configuration options.
154
+ **kw: Column configuration options.
155
+ """
156
+ if cnf is None:
157
+ return super().grid_columnconfigure(index, **kw) # type: ignore[misc]
158
+ return super().grid_columnconfigure(index, cnf, **kw) # type: ignore[misc]
159
+
160
+ def grid_size(self) -> tuple[int, int]:
161
+ """Return the grid size (columns, rows) used in this container.
162
+
163
+ Returns:
164
+ A tuple (num_columns, num_rows).
165
+ """
166
+ return super().grid_size() # type: ignore[misc]
167
+
168
+ def grid_slaves(
169
+ self,
170
+ row: int | None = None,
171
+ column: int | None = None,
172
+ ) -> list[Any]:
173
+ """Return the widgets managed by grid in this container.
174
+
175
+ Args:
176
+ row: If provided, return only widgets in the given row.
177
+ column: If provided, return only widgets in the given column.
178
+
179
+ Returns:
180
+ A list of child widgets managed by grid.
181
+ """
182
+ if row is None and column is None:
183
+ return super().grid_slaves() # type: ignore[misc]
184
+ if row is None:
185
+ return super().grid_slaves(column=column) # type: ignore[misc]
186
+ if column is None:
187
+ return super().grid_slaves(row=row) # type: ignore[misc]
188
+ return super().grid_slaves(row=row, column=column) # type: ignore[misc]