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.
- bootstack/__init__.py +249 -0
- bootstack/__main__.py +5 -0
- bootstack/api/__init__.py +127 -0
- bootstack/api/app.py +30 -0
- bootstack/api/constants.py +3 -0
- bootstack/api/data.py +23 -0
- bootstack/api/dialogs.py +44 -0
- bootstack/api/i18n.py +17 -0
- bootstack/api/localization.py +16 -0
- bootstack/api/menu.py +7 -0
- bootstack/api/style.py +23 -0
- bootstack/api/utils.py +24 -0
- bootstack/api/widgets.py +137 -0
- bootstack/assets/__init__.py +24 -0
- bootstack/assets/bootstack-transparent.png +0 -0
- bootstack/assets/bootstack.ico +0 -0
- bootstack/assets/bootstack.png +0 -0
- bootstack/assets/elements/__init__.py +0 -0
- bootstack/assets/elements/badge-pill.png +0 -0
- bootstack/assets/elements/badge-square.png +0 -0
- bootstack/assets/elements/border.png +0 -0
- bootstack/assets/elements/button-compact.png +0 -0
- bootstack/assets/elements/button-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-after-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-after-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-before-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-before-default.png +0 -0
- bootstack/assets/elements/button-group-horizontal-center-compact.png +0 -0
- bootstack/assets/elements/button-group-horizontal-center-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-after-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-after-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-before-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-before-default.png +0 -0
- bootstack/assets/elements/button-group-vertical-center-compact.png +0 -0
- bootstack/assets/elements/button-group-vertical-center-default.png +0 -0
- bootstack/assets/elements/checkbox-checked.png +0 -0
- bootstack/assets/elements/checkbox-indeterminate.png +0 -0
- bootstack/assets/elements/checkbox-unchecked.png +0 -0
- bootstack/assets/elements/field.png +0 -0
- bootstack/assets/elements/input-after-compact.png +0 -0
- bootstack/assets/elements/input-after-default.png +0 -0
- bootstack/assets/elements/input-before-compact.png +0 -0
- bootstack/assets/elements/input-before-default.png +0 -0
- bootstack/assets/elements/input-compact.png +0 -0
- bootstack/assets/elements/input-default.png +0 -0
- bootstack/assets/elements/list-item-separated.png +0 -0
- bootstack/assets/elements/list-item.png +0 -0
- bootstack/assets/elements/manifest.toml +480 -0
- bootstack/assets/elements/menu-item.png +0 -0
- bootstack/assets/elements/nav-button-compact.png +0 -0
- bootstack/assets/elements/nav-button-default.png +0 -0
- bootstack/assets/elements/nav-icon-button-compact.png +0 -0
- bootstack/assets/elements/nav-icon-button-default.png +0 -0
- bootstack/assets/elements/notebook-client-border.png +0 -0
- bootstack/assets/elements/notebook-tab-active.png +0 -0
- bootstack/assets/elements/notebook-tab-bar.png +0 -0
- bootstack/assets/elements/notebook-tab-normal.png +0 -0
- bootstack/assets/elements/notebook-tab-pill.png +0 -0
- bootstack/assets/elements/progress-bar-horizontal-striped.png +0 -0
- bootstack/assets/elements/progress-bar-solid.png +0 -0
- bootstack/assets/elements/progress-bar-thin.png +0 -0
- bootstack/assets/elements/progress-bar-vertical-striped.png +0 -0
- bootstack/assets/elements/radio-selected.png +0 -0
- bootstack/assets/elements/radio-unselected.png +0 -0
- bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- bootstack/assets/elements/scrollbar-vertical.png +0 -0
- bootstack/assets/elements/slider-handle-focus.png +0 -0
- bootstack/assets/elements/slider-handle.png +0 -0
- bootstack/assets/elements/slider-track-horizontal.png +0 -0
- bootstack/assets/elements/slider-track-vertical.png +0 -0
- bootstack/assets/elements/switch-off.png +0 -0
- bootstack/assets/elements/switch-on.png +0 -0
- bootstack/assets/elements/tabs-bar-horizontal.png +0 -0
- bootstack/assets/elements/tabs-bar-vertical.png +0 -0
- bootstack/assets/elements/tabs-pill.png +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +875 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +875 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +853 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +851 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +914 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +841 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +842 -0
- bootstack/assets/themes/__init__.py +0 -0
- bootstack/assets/themes/amber-dark.json +32 -0
- bootstack/assets/themes/amber-light.json +32 -0
- bootstack/assets/themes/aurora-dark.json +32 -0
- bootstack/assets/themes/aurora-light.json +32 -0
- bootstack/assets/themes/bootstrap-dark.json +32 -0
- bootstack/assets/themes/bootstrap-light.json +32 -0
- bootstack/assets/themes/classic-dark.json +32 -0
- bootstack/assets/themes/classic-light.json +32 -0
- bootstack/assets/themes/docs-dark.json +32 -0
- bootstack/assets/themes/docs-light.json +32 -0
- bootstack/assets/themes/forest-dark.json +32 -0
- bootstack/assets/themes/forest-light.json +32 -0
- bootstack/assets/themes/ocean-dark.json +32 -0
- bootstack/assets/themes/ocean-light.json +32 -0
- bootstack/assets/themes/rose-dark.json +32 -0
- bootstack/assets/themes/rose-light.json +32 -0
- bootstack/assets/widgets/__init__.py +0 -0
- bootstack/assets/widgets/badge-default.png +0 -0
- bootstack/assets/widgets/badge-pill.png +0 -0
- bootstack/assets/widgets/border.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-after.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-before.png +0 -0
- bootstack/assets/widgets/button-group-horizontal-center.png +0 -0
- bootstack/assets/widgets/button-group-vertical-after.png +0 -0
- bootstack/assets/widgets/button-group-vertical-before.png +0 -0
- bootstack/assets/widgets/button-group-vertical-center.png +0 -0
- bootstack/assets/widgets/button.png +0 -0
- bootstack/assets/widgets/checkbox-checked.png +0 -0
- bootstack/assets/widgets/checkbox-indeterminate.png +0 -0
- bootstack/assets/widgets/checkbox-unchecked.png +0 -0
- bootstack/assets/widgets/field.png +0 -0
- bootstack/assets/widgets/icon-button.png +0 -0
- bootstack/assets/widgets/input-inner.png +0 -0
- bootstack/assets/widgets/input-prefix.png +0 -0
- bootstack/assets/widgets/input-suffix.png +0 -0
- bootstack/assets/widgets/input.png +0 -0
- bootstack/assets/widgets/list-item-focus.png +0 -0
- bootstack/assets/widgets/list-item-separated.png +0 -0
- bootstack/assets/widgets/menu-item-separated.png +0 -0
- bootstack/assets/widgets/notebook-client-border.png +0 -0
- bootstack/assets/widgets/notebook-pill-active.png +0 -0
- bootstack/assets/widgets/notebook-pill-inactive.png +0 -0
- bootstack/assets/widgets/notebook-tab-active.png +0 -0
- bootstack/assets/widgets/notebook-tab-border.png +0 -0
- bootstack/assets/widgets/notebook-tab-normal.png +0 -0
- bootstack/assets/widgets/notebook-underline.png +0 -0
- bootstack/assets/widgets/progress-bar-horizontal-default.png +0 -0
- bootstack/assets/widgets/progress-bar-horizontal-striped.png +0 -0
- bootstack/assets/widgets/progress-bar-vertical-default.png +0 -0
- bootstack/assets/widgets/progress-bar-vertical-striped.png +0 -0
- bootstack/assets/widgets/progress-trough-horizontal.png +0 -0
- bootstack/assets/widgets/progress-trough-vertical.png +0 -0
- bootstack/assets/widgets/radio-selected.png +0 -0
- bootstack/assets/widgets/radio-unselected.png +0 -0
- bootstack/assets/widgets/scrollbar-horizontal-rounded.png +0 -0
- bootstack/assets/widgets/scrollbar-vertical-rounded.png +0 -0
- bootstack/assets/widgets/separator-horizontal.png +0 -0
- bootstack/assets/widgets/separator-vertical.png +0 -0
- bootstack/assets/widgets/slider-handle-focus.png +0 -0
- bootstack/assets/widgets/slider-handle.png +0 -0
- bootstack/assets/widgets/slider-track-horizontal.png +0 -0
- bootstack/assets/widgets/slider-track-vertical.png +0 -0
- bootstack/assets/widgets/switch-off.png +0 -0
- bootstack/assets/widgets/switch-on.png +0 -0
- bootstack/assets/widgets/tabs-bar-horizontal.png +0 -0
- bootstack/assets/widgets/tabs-bar-vertical.png +0 -0
- bootstack/assets/widgets/tabs-pill.png +0 -0
- bootstack/cli/__init__.py +124 -0
- bootstack/cli/__main__.py +6 -0
- bootstack/cli/add.py +439 -0
- bootstack/cli/build.py +115 -0
- bootstack/cli/config.py +287 -0
- bootstack/cli/demo.py +1267 -0
- bootstack/cli/doctor.py +195 -0
- bootstack/cli/list_cmd.py +71 -0
- bootstack/cli/promote.py +120 -0
- bootstack/cli/pyinstaller.py +246 -0
- bootstack/cli/run.py +99 -0
- bootstack/cli/start.py +105 -0
- bootstack/cli/templates/__init__.py +861 -0
- bootstack/constants.py +325 -0
- bootstack/core/__init__.py +34 -0
- bootstack/core/capabilities/__init__.py +45 -0
- bootstack/core/capabilities/after.py +103 -0
- bootstack/core/capabilities/bind.py +154 -0
- bootstack/core/capabilities/bindtags.py +112 -0
- bootstack/core/capabilities/busy.py +61 -0
- bootstack/core/capabilities/clipboard.py +88 -0
- bootstack/core/capabilities/focus.py +118 -0
- bootstack/core/capabilities/grab.py +65 -0
- bootstack/core/capabilities/grid.py +188 -0
- bootstack/core/capabilities/localization.py +231 -0
- bootstack/core/capabilities/pack.py +119 -0
- bootstack/core/capabilities/place.py +92 -0
- bootstack/core/capabilities/selection.py +136 -0
- bootstack/core/capabilities/signals.py +242 -0
- bootstack/core/capabilities/winfo.py +315 -0
- bootstack/core/colorutils.py +234 -0
- bootstack/core/exceptions.py +95 -0
- bootstack/core/images.py +283 -0
- bootstack/core/localization/README.md +90 -0
- bootstack/core/localization/__init__.py +13 -0
- bootstack/core/localization/intl_format.py +580 -0
- bootstack/core/localization/msgcat.py +425 -0
- bootstack/core/localization/specs.py +143 -0
- bootstack/core/mixins/__init__.py +1 -0
- bootstack/core/mixins/ttk_state.py +35 -0
- bootstack/core/mixins/widget.py +132 -0
- bootstack/core/publisher.py +147 -0
- bootstack/core/signals/README.md +112 -0
- bootstack/core/signals/__init__.py +8 -0
- bootstack/core/signals/integration.py +100 -0
- bootstack/core/signals/signal.py +317 -0
- bootstack/core/signals/types.py +4 -0
- bootstack/core/validation/__init__.py +5 -0
- bootstack/core/validation/types.py +13 -0
- bootstack/core/validation/validation_result.py +17 -0
- bootstack/core/validation/validation_rules.py +112 -0
- bootstack/core/variables.py +62 -0
- bootstack/datasource/README.md +607 -0
- bootstack/datasource/__init__.py +51 -0
- bootstack/datasource/base.py +474 -0
- bootstack/datasource/file_source.py +541 -0
- bootstack/datasource/memory_source.py +482 -0
- bootstack/datasource/sqlite_source.py +453 -0
- bootstack/datasource/types.py +259 -0
- bootstack/dialogs/__init__.py +56 -0
- bootstack/dialogs/colorchooser.py +674 -0
- bootstack/dialogs/colordropper.py +257 -0
- bootstack/dialogs/datedialog.py +404 -0
- bootstack/dialogs/dialog.py +514 -0
- bootstack/dialogs/filterdialog.py +358 -0
- bootstack/dialogs/fontdialog.py +339 -0
- bootstack/dialogs/formdialog.py +541 -0
- bootstack/dialogs/message.py +489 -0
- bootstack/dialogs/query.py +561 -0
- bootstack/py.typed +1 -0
- bootstack/runtime/__init__.py +3 -0
- bootstack/runtime/app.py +879 -0
- bootstack/runtime/base_window.py +786 -0
- bootstack/runtime/events.py +399 -0
- bootstack/runtime/menu.py +510 -0
- bootstack/runtime/shortcuts.py +423 -0
- bootstack/runtime/tk_patch.py +31 -0
- bootstack/runtime/toplevel.py +131 -0
- bootstack/runtime/utility.py +371 -0
- bootstack/runtime/visual_focus.py +228 -0
- bootstack/runtime/window_utilities.py +1043 -0
- bootstack/style/__init__.py +5498 -0
- bootstack/style/bootstyle.py +507 -0
- bootstack/style/bootstyle_builder_base.py +752 -0
- bootstack/style/bootstyle_builder_mixed.py +93 -0
- bootstack/style/bootstyle_builder_tk.py +109 -0
- bootstack/style/bootstyle_builder_ttk.py +354 -0
- bootstack/style/builders/__init__.py +51 -0
- bootstack/style/builders/badge.py +44 -0
- bootstack/style/builders/button.py +453 -0
- bootstack/style/builders/buttongroup.py +344 -0
- bootstack/style/builders/calendar.py +271 -0
- bootstack/style/builders/checkbutton.py +95 -0
- bootstack/style/builders/combobox.py +112 -0
- bootstack/style/builders/contextmenu.py +268 -0
- bootstack/style/builders/entry.py +83 -0
- bootstack/style/builders/expander.py +171 -0
- bootstack/style/builders/field.py +312 -0
- bootstack/style/builders/frame.py +27 -0
- bootstack/style/builders/label.py +28 -0
- bootstack/style/builders/labelframe.py +41 -0
- bootstack/style/builders/listview.py +267 -0
- bootstack/style/builders/menubar.py +74 -0
- bootstack/style/builders/menubutton.py +408 -0
- bootstack/style/builders/notebook.py +316 -0
- bootstack/style/builders/panedwindow.py +25 -0
- bootstack/style/builders/progressbar.py +71 -0
- bootstack/style/builders/radiobutton.py +68 -0
- bootstack/style/builders/scale.py +66 -0
- bootstack/style/builders/scrollbar.py +360 -0
- bootstack/style/builders/separator.py +45 -0
- bootstack/style/builders/sidenav.py +313 -0
- bootstack/style/builders/sizegrip.py +15 -0
- bootstack/style/builders/spinbox.py +119 -0
- bootstack/style/builders/switch.py +67 -0
- bootstack/style/builders/tabitem.py +205 -0
- bootstack/style/builders/toolbutton.py +260 -0
- bootstack/style/builders/tooltip.py +26 -0
- bootstack/style/builders/treeview.py +269 -0
- bootstack/style/builders/utils.py +404 -0
- bootstack/style/builders_tk/__init__.py +16 -0
- bootstack/style/builders_tk/defaults.py +229 -0
- bootstack/style/element.py +173 -0
- bootstack/style/style.py +499 -0
- bootstack/style/theme_provider.py +449 -0
- bootstack/style/tk_patch.py +5 -0
- bootstack/style/token_maps.py +42 -0
- bootstack/style/types.py +32 -0
- bootstack/style/typography.py +527 -0
- bootstack/style/utility.py +696 -0
- bootstack/themes/__init__.py +12 -0
- bootstack/themes/standard.py +415 -0
- bootstack/themes/user.py +45 -0
- bootstack/widgets/__init__.py +53 -0
- bootstack/widgets/composites/__init__.py +38 -0
- bootstack/widgets/composites/accordion.py +385 -0
- bootstack/widgets/composites/appshell.py +445 -0
- bootstack/widgets/composites/buttongroup.py +391 -0
- bootstack/widgets/composites/calendar.py +914 -0
- bootstack/widgets/composites/compositeframe.py +282 -0
- bootstack/widgets/composites/contextmenu.py +1754 -0
- bootstack/widgets/composites/dateentry.py +261 -0
- bootstack/widgets/composites/dropdownbutton.py +190 -0
- bootstack/widgets/composites/expander.py +508 -0
- bootstack/widgets/composites/field.py +448 -0
- bootstack/widgets/composites/floodgauge.py +434 -0
- bootstack/widgets/composites/form.py +983 -0
- bootstack/widgets/composites/labeledscale.py +209 -0
- bootstack/widgets/composites/list/__init__.py +15 -0
- bootstack/widgets/composites/list/listitem.py +733 -0
- bootstack/widgets/composites/list/listview.py +1507 -0
- bootstack/widgets/composites/menubar.py +303 -0
- bootstack/widgets/composites/meter.py +882 -0
- bootstack/widgets/composites/numericentry.py +183 -0
- bootstack/widgets/composites/pagestack.py +330 -0
- bootstack/widgets/composites/passwordentry.py +149 -0
- bootstack/widgets/composites/pathentry.py +223 -0
- bootstack/widgets/composites/radiogroup.py +466 -0
- bootstack/widgets/composites/scrolledtext.py +388 -0
- bootstack/widgets/composites/scrolledtext.pyi +186 -0
- bootstack/widgets/composites/scrollview.py +675 -0
- bootstack/widgets/composites/selectbox.py +544 -0
- bootstack/widgets/composites/sidenav/__init__.py +24 -0
- bootstack/widgets/composites/sidenav/group.py +485 -0
- bootstack/widgets/composites/sidenav/header.py +83 -0
- bootstack/widgets/composites/sidenav/item.py +413 -0
- bootstack/widgets/composites/sidenav/separator.py +51 -0
- bootstack/widgets/composites/sidenav/view.py +919 -0
- bootstack/widgets/composites/spinnerentry.py +232 -0
- bootstack/widgets/composites/tableview/__init__.py +5 -0
- bootstack/widgets/composites/tableview/tableview.py +2254 -0
- bootstack/widgets/composites/tableview/types.py +169 -0
- bootstack/widgets/composites/tabs/__init__.py +6 -0
- bootstack/widgets/composites/tabs/tabitem.py +372 -0
- bootstack/widgets/composites/tabs/tabs.py +478 -0
- bootstack/widgets/composites/tabs/tabview.py +352 -0
- bootstack/widgets/composites/textentry.py +90 -0
- bootstack/widgets/composites/timeentry.py +189 -0
- bootstack/widgets/composites/toast.py +364 -0
- bootstack/widgets/composites/togglegroup.py +382 -0
- bootstack/widgets/composites/toolbar.py +393 -0
- bootstack/widgets/composites/tooltip.py +404 -0
- bootstack/widgets/internal/__init__.py +0 -0
- bootstack/widgets/internal/wrapper_base.py +304 -0
- bootstack/widgets/mixins/__init__.py +25 -0
- bootstack/widgets/mixins/configure_mixin.py +186 -0
- bootstack/widgets/mixins/entry_mixin.py +70 -0
- bootstack/widgets/mixins/font_mixin.py +346 -0
- bootstack/widgets/mixins/icon_mixin.py +38 -0
- bootstack/widgets/mixins/localization_mixin.py +255 -0
- bootstack/widgets/mixins/signal_mixin.py +272 -0
- bootstack/widgets/mixins/validation_mixin.py +204 -0
- bootstack/widgets/parts/__init__.py +11 -0
- bootstack/widgets/parts/numberentry_part.py +345 -0
- bootstack/widgets/parts/spinnerentry_part.py +394 -0
- bootstack/widgets/parts/textentry_part.py +344 -0
- bootstack/widgets/primitives/__init__.py +55 -0
- bootstack/widgets/primitives/badge.py +44 -0
- bootstack/widgets/primitives/button.py +89 -0
- bootstack/widgets/primitives/card.py +66 -0
- bootstack/widgets/primitives/checkbutton.py +124 -0
- bootstack/widgets/primitives/checktoggle.py +53 -0
- bootstack/widgets/primitives/combobox.py +165 -0
- bootstack/widgets/primitives/entry.py +98 -0
- bootstack/widgets/primitives/frame.py +206 -0
- bootstack/widgets/primitives/gridframe.py +479 -0
- bootstack/widgets/primitives/label.py +95 -0
- bootstack/widgets/primitives/labelframe.py +63 -0
- bootstack/widgets/primitives/menubutton.py +118 -0
- bootstack/widgets/primitives/notebook.py +551 -0
- bootstack/widgets/primitives/optionmenu.py +248 -0
- bootstack/widgets/primitives/packframe.py +228 -0
- bootstack/widgets/primitives/panedwindow.py +58 -0
- bootstack/widgets/primitives/progressbar.py +95 -0
- bootstack/widgets/primitives/radiobutton.py +115 -0
- bootstack/widgets/primitives/radiotoggle.py +50 -0
- bootstack/widgets/primitives/scale.py +85 -0
- bootstack/widgets/primitives/scrollbar.py +56 -0
- bootstack/widgets/primitives/separator.py +56 -0
- bootstack/widgets/primitives/sizegrip.py +47 -0
- bootstack/widgets/primitives/spinbox.py +91 -0
- bootstack/widgets/primitives/switch.py +41 -0
- bootstack/widgets/primitives/treeview.py +77 -0
- bootstack/widgets/types.py +20 -0
- bootstack-0.1.0a1.dist-info/METADATA +196 -0
- bootstack-0.1.0a1.dist-info/RECORD +419 -0
- bootstack-0.1.0a1.dist-info/WHEEL +5 -0
- bootstack-0.1.0a1.dist-info/entry_points.txt +2 -0
- bootstack-0.1.0a1.dist-info/licenses/LICENSE +22 -0
- bootstack-0.1.0a1.dist-info/licenses/NOTICE +10 -0
- 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,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
|
+
|