bootstack 0.1.0__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 +157 -0
- bootstack/__main__.py +5 -0
- bootstack/_core/__init__.py +21 -0
- bootstack/_core/capabilities/__init__.py +45 -0
- bootstack/_core/capabilities/after.py +103 -0
- bootstack/_core/capabilities/bind.py +192 -0
- bootstack/_core/capabilities/bindtags.py +112 -0
- bootstack/_core/capabilities/busy.py +72 -0
- bootstack/_core/capabilities/clipboard.py +89 -0
- bootstack/_core/capabilities/focus.py +118 -0
- bootstack/_core/capabilities/grab.py +65 -0
- bootstack/_core/capabilities/grid.py +211 -0
- bootstack/_core/capabilities/localization.py +231 -0
- bootstack/_core/capabilities/pack.py +140 -0
- bootstack/_core/capabilities/place.py +113 -0
- bootstack/_core/capabilities/selection.py +136 -0
- bootstack/_core/capabilities/signals.py +244 -0
- bootstack/_core/capabilities/winfo.py +315 -0
- bootstack/_core/colorutils.py +234 -0
- bootstack/_core/exceptions.py +25 -0
- bootstack/_core/images.py +463 -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/paths.py +49 -0
- bootstack/_core/publisher.py +149 -0
- bootstack/_core/variables.py +62 -0
- bootstack/_runtime/__init__.py +3 -0
- bootstack/_runtime/app.py +930 -0
- bootstack/_runtime/base_window.py +945 -0
- bootstack/_runtime/events.py +399 -0
- bootstack/_runtime/shortcuts.py +496 -0
- bootstack/_runtime/tk_patch.py +43 -0
- bootstack/_runtime/toplevel.py +276 -0
- bootstack/_runtime/utility.py +457 -0
- bootstack/_runtime/visual_focus.py +240 -0
- bootstack/_runtime/window_utilities.py +1123 -0
- bootstack/assets/__init__.py +21 -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/button-compact.png +0 -0
- bootstack/assets/elements/button-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-after-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-before-v-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-h-default.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-compact.png +0 -0
- bootstack/assets/elements/buttongroup-center-v-default.png +0 -0
- bootstack/assets/elements/card.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-addon-compact.png +0 -0
- bootstack/assets/elements/input-addon-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/listrow-compact.png +0 -0
- bootstack/assets/elements/listrow-default.png +0 -0
- bootstack/assets/elements/manifest.toml +361 -0
- bootstack/assets/elements/menu-item.png +0 -0
- bootstack/assets/elements/navitem-compact.png +0 -0
- bootstack/assets/elements/navitem-default.png +0 -0
- bootstack/assets/elements/progressbar-h-compact.png +0 -0
- bootstack/assets/elements/progressbar-h-default.png +0 -0
- bootstack/assets/elements/progressbar-v-compact.png +0 -0
- bootstack/assets/elements/progressbar-v-default.png +0 -0
- bootstack/assets/elements/radiobutton.png +0 -0
- bootstack/assets/elements/scrollbar-horizontal.png +0 -0
- bootstack/assets/elements/scrollbar-vertical.png +0 -0
- bootstack/assets/elements/slider-handle.png +0 -0
- bootstack/assets/elements/slider-track-h.png +0 -0
- bootstack/assets/elements/slider-track-v.png +0 -0
- bootstack/assets/elements/switch-off.png +0 -0
- bootstack/assets/elements/switch-on.png +0 -0
- bootstack/assets/elements/tab-h.png +0 -0
- bootstack/assets/elements/tab-v.png +0 -0
- bootstack/assets/icons/bootstrap.ttf +0 -0
- bootstack/assets/icons/glyphmap.json +2080 -0
- bootstack/assets/icons/icon_metrics.json +12470 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ar/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/bg/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/cs/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/da/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/de/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/en/LC_MESSAGES/bootstack.po +878 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/es/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/fr/LC_MESSAGES/bootstack.po +856 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/he/LC_MESSAGES/bootstack.po +854 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/hi/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/it/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ja/LC_MESSAGES/bootstack.po +917 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/ko/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nb/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/nl/LC_MESSAGES/bootstack.po +844 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/pt_BR/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sl/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/sv/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/tr/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_CN/LC_MESSAGES/bootstack.po +845 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.mo +0 -0
- bootstack/assets/locales/zh_TW/LC_MESSAGES/bootstack.po +845 -0
- bootstack/cli/__init__.py +133 -0
- bootstack/cli/__main__.py +6 -0
- bootstack/cli/add.py +395 -0
- bootstack/cli/appicon.py +285 -0
- bootstack/cli/build.py +115 -0
- bootstack/cli/config.py +313 -0
- bootstack/cli/demo.py +564 -0
- bootstack/cli/dev.py +153 -0
- bootstack/cli/doctor.py +195 -0
- bootstack/cli/icons.py +98 -0
- bootstack/cli/promote.py +120 -0
- bootstack/cli/pyinstaller.py +268 -0
- bootstack/cli/run.py +95 -0
- bootstack/cli/start.py +117 -0
- bootstack/cli/templates/__init__.py +931 -0
- bootstack/clipboard.py +48 -0
- bootstack/constants.py +318 -0
- bootstack/data/README.md +615 -0
- bootstack/data/__init__.py +78 -0
- bootstack/data/_observable.py +276 -0
- bootstack/data/base.py +780 -0
- bootstack/data/file_source.py +367 -0
- bootstack/data/memory_source.py +450 -0
- bootstack/data/query.py +367 -0
- bootstack/data/readers.py +289 -0
- bootstack/data/sqlite_source.py +869 -0
- bootstack/data/types.py +354 -0
- bootstack/data/writers.py +232 -0
- bootstack/dev/__init__.py +36 -0
- bootstack/dev/_capture.py +141 -0
- bootstack/dev/_env.py +43 -0
- bootstack/dev/_registry.py +140 -0
- bootstack/dev/_reloader.py +351 -0
- bootstack/dev/_reset.py +50 -0
- bootstack/dev/_watcher.py +91 -0
- bootstack/dialogs/__init__.py +948 -0
- bootstack/dialogs/_impl/__init__.py +47 -0
- bootstack/dialogs/_impl/colorchooser.py +588 -0
- bootstack/dialogs/_impl/datedialog.py +450 -0
- bootstack/dialogs/_impl/dialog.py +594 -0
- bootstack/dialogs/_impl/filterdialog.py +358 -0
- bootstack/dialogs/_impl/fontdialog.py +364 -0
- bootstack/dialogs/_impl/formdialog.py +564 -0
- bootstack/dialogs/_impl/message.py +486 -0
- bootstack/dialogs/_impl/query.py +570 -0
- bootstack/errors.py +67 -0
- bootstack/events/__init__.py +111 -0
- bootstack/events/_event.py +135 -0
- bootstack/events/_payloads.py +539 -0
- bootstack/events/_subscription.py +38 -0
- bootstack/i18n/README.md +77 -0
- bootstack/i18n/__init__.py +23 -0
- bootstack/i18n/catalog.py +121 -0
- bootstack/i18n/intl_format.py +584 -0
- bootstack/i18n/msgcat.py +425 -0
- bootstack/i18n/specs.py +156 -0
- bootstack/images.py +563 -0
- bootstack/py.typed +1 -0
- bootstack/scheduling/__init__.py +11 -0
- bootstack/scheduling/_schedule.py +218 -0
- bootstack/shortcuts.py +21 -0
- bootstack/signals/README.md +98 -0
- bootstack/signals/__init__.py +10 -0
- bootstack/signals/integration.py +100 -0
- bootstack/signals/signal.py +353 -0
- bootstack/signals/types.py +6 -0
- bootstack/store.py +286 -0
- bootstack/streams/__init__.py +12 -0
- bootstack/streams/_stream.py +321 -0
- bootstack/style/__init__.py +38 -0
- bootstack/style/builders/__init__.py +51 -0
- bootstack/style/builders/badge.py +46 -0
- bootstack/style/builders/button.py +339 -0
- bootstack/style/builders/buttongroup.py +311 -0
- bootstack/style/builders/calendar.py +271 -0
- bootstack/style/builders/checkbutton.py +110 -0
- bootstack/style/builders/combobox.py +113 -0
- bootstack/style/builders/contextmenu.py +268 -0
- bootstack/style/builders/entry.py +82 -0
- bootstack/style/builders/expander.py +148 -0
- bootstack/style/builders/field.py +335 -0
- bootstack/style/builders/frame.py +50 -0
- bootstack/style/builders/label.py +28 -0
- bootstack/style/builders/labelframe.py +34 -0
- bootstack/style/builders/listview.py +369 -0
- bootstack/style/builders/menubar.py +91 -0
- bootstack/style/builders/menubutton.py +359 -0
- bootstack/style/builders/panedwindow.py +25 -0
- bootstack/style/builders/progressbar.py +67 -0
- bootstack/style/builders/radiobutton.py +99 -0
- bootstack/style/builders/scale.py +64 -0
- bootstack/style/builders/scrollbar.py +225 -0
- bootstack/style/builders/separator.py +49 -0
- bootstack/style/builders/sidenav.py +643 -0
- bootstack/style/builders/sizegrip.py +15 -0
- bootstack/style/builders/spinbox.py +119 -0
- bootstack/style/builders/switch.py +70 -0
- bootstack/style/builders/tabitem.py +204 -0
- bootstack/style/builders/togglegroup.py +294 -0
- bootstack/style/builders/toolbutton.py +275 -0
- bootstack/style/builders/tooltip.py +26 -0
- bootstack/style/builders/treeview.py +193 -0
- bootstack/style/builders/utils.py +455 -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/fonts.py +123 -0
- bootstack/style/style.py +609 -0
- bootstack/style/style_builder_base.py +716 -0
- bootstack/style/style_builder_mixed.py +93 -0
- bootstack/style/style_builder_tk.py +109 -0
- bootstack/style/style_builder_ttk.py +353 -0
- bootstack/style/style_resolver.py +447 -0
- bootstack/style/theme.py +245 -0
- bootstack/style/theme_provider.py +471 -0
- bootstack/style/themes/__init__.py +128 -0
- bootstack/style/tk_patch.py +5 -0
- bootstack/style/token_maps.py +41 -0
- bootstack/style/types.py +32 -0
- bootstack/style/typography.py +523 -0
- bootstack/style/utility.py +746 -0
- bootstack/types.py +39 -0
- bootstack/validation/__init__.py +6 -0
- bootstack/validation/types.py +15 -0
- bootstack/validation/validation_result.py +17 -0
- bootstack/validation/validation_rules.py +205 -0
- bootstack/widgets/__init__.py +74 -0
- bootstack/widgets/_core/__init__.py +31 -0
- bootstack/widgets/_core/app_config.py +266 -0
- bootstack/widgets/_core/base.py +461 -0
- bootstack/widgets/_core/container.py +334 -0
- bootstack/widgets/_core/context.py +35 -0
- bootstack/widgets/_core/events.py +130 -0
- bootstack/widgets/_core/field_mixin.py +353 -0
- bootstack/widgets/_core/icon_image_props.py +72 -0
- bootstack/widgets/_core/image_binding.py +93 -0
- bootstack/widgets/_core/navmodel.py +345 -0
- bootstack/widgets/_core/options.py +210 -0
- bootstack/widgets/_core/selection_group.py +130 -0
- bootstack/widgets/_core/window_controls.py +96 -0
- bootstack/widgets/_core/window_menu.py +246 -0
- bootstack/widgets/_impl/__init__.py +1 -0
- bootstack/widgets/_impl/_internal/__init__.py +0 -0
- bootstack/widgets/_impl/_internal/wrapper_base.py +307 -0
- bootstack/widgets/_impl/_parts/__init__.py +11 -0
- bootstack/widgets/_impl/_parts/numberentry_part.py +385 -0
- bootstack/widgets/_impl/_parts/spinnerentry_part.py +434 -0
- bootstack/widgets/_impl/_parts/textentry_part.py +406 -0
- bootstack/widgets/_impl/composites/__init__.py +33 -0
- bootstack/widgets/_impl/composites/_dateutils.py +33 -0
- bootstack/widgets/_impl/composites/_image_fit.py +105 -0
- bootstack/widgets/_impl/composites/accordion.py +381 -0
- bootstack/widgets/_impl/composites/avatar.py +191 -0
- bootstack/widgets/_impl/composites/buttongroup.py +371 -0
- bootstack/widgets/_impl/composites/calendar.py +972 -0
- bootstack/widgets/_impl/composites/carousel.py +567 -0
- bootstack/widgets/_impl/composites/chart.py +882 -0
- bootstack/widgets/_impl/composites/compositeframe.py +298 -0
- bootstack/widgets/_impl/composites/contextmenu.py +1951 -0
- bootstack/widgets/_impl/composites/dateentry.py +404 -0
- bootstack/widgets/_impl/composites/dropdownbutton.py +325 -0
- bootstack/widgets/_impl/composites/expander.py +515 -0
- bootstack/widgets/_impl/composites/field.py +670 -0
- bootstack/widgets/_impl/composites/form.py +1066 -0
- bootstack/widgets/_impl/composites/gallery.py +551 -0
- bootstack/widgets/_impl/composites/list/__init__.py +15 -0
- bootstack/widgets/_impl/composites/list/listitem.py +802 -0
- bootstack/widgets/_impl/composites/list/listview.py +1433 -0
- bootstack/widgets/_impl/composites/menu/__init__.py +18 -0
- bootstack/widgets/_impl/composites/menu/model.py +358 -0
- bootstack/widgets/_impl/composites/menu/render_native.py +134 -0
- bootstack/widgets/_impl/composites/menu/render_themed.py +134 -0
- bootstack/widgets/_impl/composites/meter.py +860 -0
- bootstack/widgets/_impl/composites/numericentry.py +201 -0
- bootstack/widgets/_impl/composites/pagestack.py +395 -0
- bootstack/widgets/_impl/composites/passwordentry.py +142 -0
- bootstack/widgets/_impl/composites/pathentry.py +168 -0
- bootstack/widgets/_impl/composites/picture.py +289 -0
- bootstack/widgets/_impl/composites/radiogroup.py +511 -0
- bootstack/widgets/_impl/composites/scrolledtext.py +375 -0
- bootstack/widgets/_impl/composites/scrolledtext.pyi +186 -0
- bootstack/widgets/_impl/composites/scrollview.py +764 -0
- bootstack/widgets/_impl/composites/selectbox.py +1026 -0
- bootstack/widgets/_impl/composites/shell/__init__.py +40 -0
- bootstack/widgets/_impl/composites/shell/content_host.py +52 -0
- bootstack/widgets/_impl/composites/shell/layout.py +335 -0
- bootstack/widgets/_impl/composites/shell/nav_panel.py +345 -0
- bootstack/widgets/_impl/composites/shell/providers.py +558 -0
- bootstack/widgets/_impl/composites/shell/rail.py +117 -0
- bootstack/widgets/_impl/composites/shell/shell.py +581 -0
- bootstack/widgets/_impl/composites/shell/workspace.py +273 -0
- bootstack/widgets/_impl/composites/sidenav/__init__.py +16 -0
- bootstack/widgets/_impl/composites/sidenav/header.py +81 -0
- bootstack/widgets/_impl/composites/sidenav/separator.py +44 -0
- bootstack/widgets/_impl/composites/slider/__init__.py +7 -0
- bootstack/widgets/_impl/composites/slider/_shared.py +195 -0
- bootstack/widgets/_impl/composites/slider/rangeslider.py +982 -0
- bootstack/widgets/_impl/composites/slider/slider.py +851 -0
- bootstack/widgets/_impl/composites/spinnerentry.py +185 -0
- bootstack/widgets/_impl/composites/tableview/__init__.py +5 -0
- bootstack/widgets/_impl/composites/tableview/tableview.py +3388 -0
- bootstack/widgets/_impl/composites/tableview/types.py +169 -0
- bootstack/widgets/_impl/composites/tabs/__init__.py +23 -0
- bootstack/widgets/_impl/composites/tabs/tabitem.py +389 -0
- bootstack/widgets/_impl/composites/tabs/tabs.py +974 -0
- bootstack/widgets/_impl/composites/tabs/tabview.py +650 -0
- bootstack/widgets/_impl/composites/textarea/__init__.py +26 -0
- bootstack/widgets/_impl/composites/textarea/change.py +46 -0
- bootstack/widgets/_impl/composites/textarea/codeeditor.py +526 -0
- bootstack/widgets/_impl/composites/textarea/core.py +495 -0
- bootstack/widgets/_impl/composites/textarea/decoration.py +42 -0
- bootstack/widgets/_impl/composites/textarea/diff.py +127 -0
- bootstack/widgets/_impl/composites/textarea/extensions/__init__.py +1 -0
- bootstack/widgets/_impl/composites/textarea/extensions/bracket_matcher.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/indent_guides.py +158 -0
- bootstack/widgets/_impl/composites/textarea/extensions/line_numbers.py +138 -0
- bootstack/widgets/_impl/composites/textarea/extensions/pygments_highlighter.py +312 -0
- bootstack/widgets/_impl/composites/textarea/extensions/smart_indent.py +177 -0
- bootstack/widgets/_impl/composites/textarea/filter.py +171 -0
- bootstack/widgets/_impl/composites/textarea/search_overlay.py +459 -0
- bootstack/widgets/_impl/composites/textarea/sidebar.py +88 -0
- bootstack/widgets/_impl/composites/textarea/style_registry.py +178 -0
- bootstack/widgets/_impl/composites/textarea/textarea.py +606 -0
- bootstack/widgets/_impl/composites/textarea/undo.py +217 -0
- bootstack/widgets/_impl/composites/textentry.py +57 -0
- bootstack/widgets/_impl/composites/timeentry.py +176 -0
- bootstack/widgets/_impl/composites/toast.py +390 -0
- bootstack/widgets/_impl/composites/toast_stack.py +156 -0
- bootstack/widgets/_impl/composites/togglegroup.py +418 -0
- bootstack/widgets/_impl/composites/toolbar.py +608 -0
- bootstack/widgets/_impl/composites/tooltip.py +491 -0
- bootstack/widgets/_impl/composites/tree/__init__.py +7 -0
- bootstack/widgets/_impl/composites/tree/source_binding.py +136 -0
- bootstack/widgets/_impl/composites/tree/treeitem.py +393 -0
- bootstack/widgets/_impl/composites/tree/treenode.py +174 -0
- bootstack/widgets/_impl/composites/tree/treeview.py +841 -0
- bootstack/widgets/_impl/mixins/__init__.py +24 -0
- bootstack/widgets/_impl/mixins/configure_mixin.py +216 -0
- bootstack/widgets/_impl/mixins/entry_mixin.py +134 -0
- bootstack/widgets/_impl/mixins/font_mixin.py +368 -0
- bootstack/widgets/_impl/mixins/icon_mixin.py +61 -0
- bootstack/widgets/_impl/mixins/localization_mixin.py +253 -0
- bootstack/widgets/_impl/mixins/signal_mixin.py +268 -0
- bootstack/widgets/_impl/mixins/validation_mixin.py +226 -0
- bootstack/widgets/_impl/primitives/__init__.py +49 -0
- bootstack/widgets/_impl/primitives/_menubutton.py +107 -0
- bootstack/widgets/_impl/primitives/badge.py +45 -0
- bootstack/widgets/_impl/primitives/button.py +76 -0
- bootstack/widgets/_impl/primitives/card.py +45 -0
- bootstack/widgets/_impl/primitives/checkbutton.py +124 -0
- bootstack/widgets/_impl/primitives/checktoggle.py +62 -0
- bootstack/widgets/_impl/primitives/combobox.py +156 -0
- bootstack/widgets/_impl/primitives/entry.py +87 -0
- bootstack/widgets/_impl/primitives/flexframe.py +448 -0
- bootstack/widgets/_impl/primitives/frame.py +185 -0
- bootstack/widgets/_impl/primitives/gridframe.py +546 -0
- bootstack/widgets/_impl/primitives/label.py +84 -0
- bootstack/widgets/_impl/primitives/labelframe.py +54 -0
- bootstack/widgets/_impl/primitives/optionmenu.py +387 -0
- bootstack/widgets/_impl/primitives/packframe.py +227 -0
- bootstack/widgets/_impl/primitives/panedwindow.py +45 -0
- bootstack/widgets/_impl/primitives/progressbar.py +83 -0
- bootstack/widgets/_impl/primitives/radiobutton.py +115 -0
- bootstack/widgets/_impl/primitives/radiotoggle.py +54 -0
- bootstack/widgets/_impl/primitives/scrollbar.py +42 -0
- bootstack/widgets/_impl/primitives/separator.py +43 -0
- bootstack/widgets/_impl/primitives/sizegrip.py +33 -0
- bootstack/widgets/_impl/primitives/spinbox.py +95 -0
- bootstack/widgets/_impl/primitives/switch.py +44 -0
- bootstack/widgets/_impl/primitives/treeview.py +69 -0
- bootstack/widgets/app.py +371 -0
- bootstack/widgets/appshell.py +1179 -0
- bootstack/widgets/avatar.py +140 -0
- bootstack/widgets/boolean_controls.py +455 -0
- bootstack/widgets/button.py +224 -0
- bootstack/widgets/buttongroup.py +239 -0
- bootstack/widgets/calendar.py +195 -0
- bootstack/widgets/card.py +159 -0
- bootstack/widgets/carousel.py +241 -0
- bootstack/widgets/chart.py +302 -0
- bootstack/widgets/codeeditor.py +675 -0
- bootstack/widgets/contextmenu.py +371 -0
- bootstack/widgets/datatable.py +688 -0
- bootstack/widgets/datefield.py +395 -0
- bootstack/widgets/divider.py +60 -0
- bootstack/widgets/expander.py +579 -0
- bootstack/widgets/form.py +200 -0
- bootstack/widgets/gallery.py +250 -0
- bootstack/widgets/gauge.py +168 -0
- bootstack/widgets/grid.py +121 -0
- bootstack/widgets/groupbox.py +162 -0
- bootstack/widgets/label.py +229 -0
- bootstack/widgets/listview.py +354 -0
- bootstack/widgets/menubutton.py +419 -0
- bootstack/widgets/numberfield.py +431 -0
- bootstack/widgets/pagestack.py +345 -0
- bootstack/widgets/passwordfield.py +383 -0
- bootstack/widgets/pathfield.py +454 -0
- bootstack/widgets/picture.py +251 -0
- bootstack/widgets/progressbar.py +106 -0
- bootstack/widgets/radio_variants.py +271 -0
- bootstack/widgets/radiogroup.py +228 -0
- bootstack/widgets/scrollbar.py +64 -0
- bootstack/widgets/scrollview.py +186 -0
- bootstack/widgets/select.py +302 -0
- bootstack/widgets/selectbutton.py +182 -0
- bootstack/widgets/sidebar_toggle.py +130 -0
- bootstack/widgets/sizegrip.py +42 -0
- bootstack/widgets/slider.py +408 -0
- bootstack/widgets/spinbox.py +147 -0
- bootstack/widgets/spinnerfield.py +413 -0
- bootstack/widgets/splash.py +367 -0
- bootstack/widgets/splitview.py +482 -0
- bootstack/widgets/stacks.py +249 -0
- bootstack/widgets/statusbar.py +189 -0
- bootstack/widgets/tabs.py +425 -0
- bootstack/widgets/textarea.py +459 -0
- bootstack/widgets/textfield.py +410 -0
- bootstack/widgets/theme_toggle.py +92 -0
- bootstack/widgets/timefield.py +340 -0
- bootstack/widgets/toast.py +314 -0
- bootstack/widgets/togglegroup.py +231 -0
- bootstack/widgets/toolbar.py +347 -0
- bootstack/widgets/tooltip.py +94 -0
- bootstack/widgets/tree.py +648 -0
- bootstack/widgets/types.py +305 -0
- bootstack/widgets/window.py +307 -0
- bootstack-0.1.0.dist-info/METADATA +301 -0
- bootstack-0.1.0.dist-info/RECORD +471 -0
- bootstack-0.1.0.dist-info/WHEEL +5 -0
- bootstack-0.1.0.dist-info/entry_points.txt +2 -0
- bootstack-0.1.0.dist-info/licenses/LICENSE +21 -0
- bootstack-0.1.0.dist-info/licenses/NOTICE +10 -0
- bootstack-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Widget mixins for bootstack."""
|
|
2
|
+
|
|
3
|
+
from bootstack.widgets._impl.mixins.configure_mixin import (
|
|
4
|
+
ConfigureDelegationMixin,
|
|
5
|
+
CustomConfigMixin,
|
|
6
|
+
configure_delegate,
|
|
7
|
+
)
|
|
8
|
+
from bootstack.widgets._impl.mixins.font_mixin import FontMixin
|
|
9
|
+
from bootstack.widgets._impl.mixins.icon_mixin import IconMixin
|
|
10
|
+
from bootstack.widgets._impl.mixins.signal_mixin import SignalMixin, TextSignalMixin
|
|
11
|
+
from bootstack.widgets._impl.mixins.validation_mixin import ValidationMixin
|
|
12
|
+
from bootstack.widgets._impl.mixins.localization_mixin import LocalizationMixin
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"ConfigureDelegationMixin",
|
|
16
|
+
"CustomConfigMixin",
|
|
17
|
+
"configure_delegate",
|
|
18
|
+
"FontMixin",
|
|
19
|
+
"IconMixin",
|
|
20
|
+
"SignalMixin",
|
|
21
|
+
"TextSignalMixin",
|
|
22
|
+
"ValidationMixin",
|
|
23
|
+
"LocalizationMixin",
|
|
24
|
+
]
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Configuration delegation helpers for widget classes.
|
|
2
|
+
|
|
3
|
+
Provides a decorator and mixin so widgets can handle custom configure keys
|
|
4
|
+
without large if/else blocks. Suited for use by bootstack wrapper
|
|
5
|
+
subclasses and custom widgets.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, Callable
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def configure_delegate(*names: str):
|
|
14
|
+
"""Decorator to mark a method as a configure handler for given names.
|
|
15
|
+
|
|
16
|
+
The decorated method should accept a single argument `value` to set,
|
|
17
|
+
and optionally return None. For getting values, the mixin will read
|
|
18
|
+
from self._<option_name> directly.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def _decorator(func: Callable[[Any, Any], Any]):
|
|
22
|
+
keys = set(getattr(func, "_bootstack_configure_keys", ()))
|
|
23
|
+
keys.update(names)
|
|
24
|
+
setattr(func, "_bootstack_configure_keys", tuple(keys))
|
|
25
|
+
return func
|
|
26
|
+
|
|
27
|
+
return _decorator
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ConfigureDelegationMixin:
|
|
31
|
+
"""Mix-in that dispatches configure keys to decorated handlers.
|
|
32
|
+
|
|
33
|
+
Subclasses can annotate methods with @configure_delegate("key") to handle
|
|
34
|
+
custom configuration entries without if/else chains.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
_configure_delegate_map: dict[str, str] = {}
|
|
38
|
+
|
|
39
|
+
def __init_subclass__(cls, **kwargs: Any) -> None:
|
|
40
|
+
"""Build the key→handler map from all @configure_delegate methods in the MRO."""
|
|
41
|
+
super().__init_subclass__(**kwargs)
|
|
42
|
+
mapping: dict[str, str] = {}
|
|
43
|
+
for base in reversed(cls.__mro__):
|
|
44
|
+
for name, member in getattr(base, "__dict__", {}).items():
|
|
45
|
+
keys = getattr(member, "_bootstack_configure_keys", None)
|
|
46
|
+
if keys:
|
|
47
|
+
for k in keys:
|
|
48
|
+
mapping[str(k)] = name
|
|
49
|
+
cls._configure_delegate_map = mapping
|
|
50
|
+
|
|
51
|
+
def _config_delegate_set(self, key: str, value: Any) -> bool:
|
|
52
|
+
"""Invoke the delegate handler for `key` with `value`.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
True if a handler was found and called, False otherwise.
|
|
56
|
+
"""
|
|
57
|
+
method_name = self._configure_delegate_map.get(key)
|
|
58
|
+
if not method_name:
|
|
59
|
+
return False
|
|
60
|
+
handler = getattr(self, method_name)
|
|
61
|
+
handler(value)
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
def _config_delegate_get(self, key: str) -> tuple[bool, Any]:
|
|
65
|
+
"""Query the delegate handler for `key`.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
A `(handled, value)` tuple. `handled` is False if no handler
|
|
69
|
+
exists for the key.
|
|
70
|
+
"""
|
|
71
|
+
method_name = self._configure_delegate_map.get(key)
|
|
72
|
+
if not method_name:
|
|
73
|
+
return False, None
|
|
74
|
+
handler = getattr(self, method_name)
|
|
75
|
+
value = handler(None)
|
|
76
|
+
# For variable options, return the string name instead of the object
|
|
77
|
+
if key in ('variable', 'textvariable') and hasattr(value, '_name'):
|
|
78
|
+
return True, str(value)
|
|
79
|
+
return True, value
|
|
80
|
+
|
|
81
|
+
def configure(self, cnf: str | dict | None = None, **kwargs: Any) -> Any:
|
|
82
|
+
"""Set one or more widget options, or query the current value of a named option.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
cnf: Option name to query (e.g. `'accent'`), a dict of options to
|
|
86
|
+
set, or None when passing options as keyword arguments.
|
|
87
|
+
**kwargs: Option names and values to set (e.g. `accent='primary'`).
|
|
88
|
+
"""
|
|
89
|
+
if kwargs:
|
|
90
|
+
for _k in list(kwargs.keys()):
|
|
91
|
+
if _k in self._configure_delegate_map:
|
|
92
|
+
if self._config_delegate_set(_k, kwargs[_k]):
|
|
93
|
+
kwargs.pop(_k, None)
|
|
94
|
+
|
|
95
|
+
if isinstance(cnf, str) and cnf in self._configure_delegate_map:
|
|
96
|
+
handled, value = self._config_delegate_get(cnf)
|
|
97
|
+
if handled:
|
|
98
|
+
# Return in standard Tkinter format: (name, dbName, dbClass, default, current)
|
|
99
|
+
return (cnf, cnf, cnf.capitalize(), None, value)
|
|
100
|
+
|
|
101
|
+
return super().configure(cnf, **kwargs)
|
|
102
|
+
|
|
103
|
+
config = configure
|
|
104
|
+
|
|
105
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
106
|
+
"""Set a configuration option using `widget[key] = value` syntax."""
|
|
107
|
+
if key in self._configure_delegate_map:
|
|
108
|
+
self._config_delegate_set(key, value)
|
|
109
|
+
return
|
|
110
|
+
return super().__setitem__(key, value)
|
|
111
|
+
|
|
112
|
+
def __getitem__(self, key: str) -> Any:
|
|
113
|
+
"""Return the current value of a configuration option using `widget[key]` syntax."""
|
|
114
|
+
if key in self._configure_delegate_map:
|
|
115
|
+
handled, value = self._config_delegate_get(key)
|
|
116
|
+
if handled:
|
|
117
|
+
return value
|
|
118
|
+
return super().__getitem__(key)
|
|
119
|
+
|
|
120
|
+
def cget(self, key: str) -> Any:
|
|
121
|
+
"""Return the current value of a configuration option.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
key: Option name, e.g. `'accent'`, `'icon'`.
|
|
125
|
+
"""
|
|
126
|
+
if key in self._configure_delegate_map:
|
|
127
|
+
handled, value = self._config_delegate_get(key)
|
|
128
|
+
if handled:
|
|
129
|
+
return value
|
|
130
|
+
return super().cget(key)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class CustomConfigMixin(ConfigureDelegationMixin):
|
|
134
|
+
"""Tk-like configure/cget API for non-tkinter classes.
|
|
135
|
+
|
|
136
|
+
Stores arbitrary options locally while still honoring @configure_delegate
|
|
137
|
+
handlers for custom keys. Useful for helper classes that wrap tkinter
|
|
138
|
+
widgets but do not inherit from them directly.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
142
|
+
self._custom_config_store: dict[str, Any] = {}
|
|
143
|
+
super().__init__(*args, **kwargs)
|
|
144
|
+
|
|
145
|
+
def _all_option_keys(self) -> set[str]:
|
|
146
|
+
"""Return the union of stored keys and delegated keys."""
|
|
147
|
+
return set(self._custom_config_store.keys()) | set(self._configure_delegate_map.keys())
|
|
148
|
+
|
|
149
|
+
def configure(self, cnf: str | dict | None = None, **kwargs: Any) -> Any:
|
|
150
|
+
"""Set one or more widget options, or query the current value of a named option.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
cnf: Option name to query (e.g. `'accent'`), a dict of options to
|
|
154
|
+
set, or None when passing options as keyword arguments.
|
|
155
|
+
**kwargs: Option names and values to set (e.g. `accent='primary'`).
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
When `cnf` is None, a dict of all options in tkinter tuple format.
|
|
159
|
+
When `cnf` is a string, a `(name, dbName, dbClass, default, current)`
|
|
160
|
+
tuple. None when setting options.
|
|
161
|
+
"""
|
|
162
|
+
if isinstance(cnf, dict):
|
|
163
|
+
kwargs.update(cnf)
|
|
164
|
+
cnf = None
|
|
165
|
+
|
|
166
|
+
if kwargs:
|
|
167
|
+
for _k in list(kwargs.keys()):
|
|
168
|
+
if _k in self._configure_delegate_map:
|
|
169
|
+
if self._config_delegate_set(_k, kwargs[_k]):
|
|
170
|
+
kwargs.pop(_k, None)
|
|
171
|
+
|
|
172
|
+
for key, value in kwargs.items():
|
|
173
|
+
self._custom_config_store[key] = value
|
|
174
|
+
|
|
175
|
+
if cnf is None:
|
|
176
|
+
return {
|
|
177
|
+
key: (key, key, key.capitalize(), None, self.cget(key))
|
|
178
|
+
for key in self._all_option_keys()
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if isinstance(cnf, str):
|
|
182
|
+
return (cnf, cnf, cnf.capitalize(), None, self.cget(cnf))
|
|
183
|
+
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
config = configure
|
|
187
|
+
|
|
188
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
189
|
+
"""Set an option using `obj[key] = value` syntax."""
|
|
190
|
+
if key in self._configure_delegate_map:
|
|
191
|
+
if self._config_delegate_set(key, value):
|
|
192
|
+
return
|
|
193
|
+
self._custom_config_store[key] = value
|
|
194
|
+
|
|
195
|
+
def __getitem__(self, key: str) -> Any:
|
|
196
|
+
"""Return an option value using `obj[key]` syntax."""
|
|
197
|
+
if key in self._configure_delegate_map:
|
|
198
|
+
handled, value = self._config_delegate_get(key)
|
|
199
|
+
if handled:
|
|
200
|
+
return value
|
|
201
|
+
return self._custom_config_store.get(key)
|
|
202
|
+
|
|
203
|
+
def cget(self, key: str) -> Any:
|
|
204
|
+
"""Return the current value for an option.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
key: Option name to query.
|
|
208
|
+
"""
|
|
209
|
+
if key in self._configure_delegate_map:
|
|
210
|
+
handled, value = self._config_delegate_get(key)
|
|
211
|
+
if handled:
|
|
212
|
+
return value
|
|
213
|
+
return self._custom_config_store.get(key)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
__all__ = ["configure_delegate", "ConfigureDelegationMixin", "CustomConfigMixin"]
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from bootstack.widgets._impl._parts.numberentry_part import NumberEntryPart
|
|
7
|
+
from bootstack.widgets._impl._parts.textentry_part import TextEntryPart
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EntryMixin:
|
|
11
|
+
"""Exposes the text-editing API of the internal entry part on composite widgets.
|
|
12
|
+
|
|
13
|
+
Composite widgets that embed a text or numeric entry part inherit this mixin
|
|
14
|
+
so callers can manipulate content (insert, delete, select) directly on the
|
|
15
|
+
composite without accessing the internal part.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
_entry: TextEntryPart | NumberEntryPart
|
|
19
|
+
|
|
20
|
+
def bbox(self, index: int | str) -> tuple[int, int, int, int]:
|
|
21
|
+
"""Return the bounding box of the character at index.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
index: Character index or named position (e.g., `'insert'`, `'end'`).
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
A tuple `(x, y, width, height)` in pixels.
|
|
28
|
+
"""
|
|
29
|
+
return self._entry.bbox(index)
|
|
30
|
+
|
|
31
|
+
def delete(self, first: int | str, last: int | str = None) -> None:
|
|
32
|
+
"""Delete text between two indices.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
first: Start index (inclusive).
|
|
36
|
+
last: End index (exclusive). If None, deletes a single character at `first`.
|
|
37
|
+
"""
|
|
38
|
+
return self._entry.delete(first, last)
|
|
39
|
+
|
|
40
|
+
def insert(self, index: int | str, text: str) -> None:
|
|
41
|
+
"""Insert text at the given index.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
index: Position to insert at. Use `'end'` to append.
|
|
45
|
+
text: Text to insert.
|
|
46
|
+
"""
|
|
47
|
+
return self._entry.insert(index, text)
|
|
48
|
+
|
|
49
|
+
def icursor(self, index: int | str) -> None:
|
|
50
|
+
"""Move the insertion cursor to index.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
index: Target cursor position.
|
|
54
|
+
"""
|
|
55
|
+
self._entry.icursor(index)
|
|
56
|
+
|
|
57
|
+
def index(self, index: int | str = 'insert') -> int:
|
|
58
|
+
"""Return the numerical index of a position.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
index: Named position or numerical index. Defaults to `'insert'`
|
|
62
|
+
(the current cursor position).
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
The numerical character index.
|
|
66
|
+
"""
|
|
67
|
+
return self._entry.index(index)
|
|
68
|
+
|
|
69
|
+
def scan_mark(self, x: int) -> None:
|
|
70
|
+
"""Record the starting position for a drag-to-scroll operation.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
x: The x-coordinate (in pixels) where the drag begins.
|
|
74
|
+
"""
|
|
75
|
+
return self._entry.scan_mark(x)
|
|
76
|
+
|
|
77
|
+
def scan_dragto(self, x: int) -> None:
|
|
78
|
+
"""Scroll the entry to follow the pointer during a drag operation.
|
|
79
|
+
|
|
80
|
+
Call after `scan_mark` as the pointer moves.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
x: The current x-coordinate (in pixels) of the pointer.
|
|
84
|
+
"""
|
|
85
|
+
return self._entry.scan_dragto(x)
|
|
86
|
+
|
|
87
|
+
def selection_adjust(self, index: int | str) -> None:
|
|
88
|
+
"""Extend or shrink the selection to include index.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
index: Target index to adjust the selection endpoint to.
|
|
92
|
+
"""
|
|
93
|
+
return self._entry.selection_adjust(index)
|
|
94
|
+
|
|
95
|
+
def selection_clear(self) -> None:
|
|
96
|
+
"""Clear the current text selection."""
|
|
97
|
+
return self._entry.selection_clear()
|
|
98
|
+
|
|
99
|
+
def selection_from(self, index: int | str) -> None:
|
|
100
|
+
"""Set the selection anchor to index.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
index: The index at which the selection starts.
|
|
104
|
+
"""
|
|
105
|
+
return self._entry.selection_from(index)
|
|
106
|
+
|
|
107
|
+
def selection_to(self, index: int | str) -> None:
|
|
108
|
+
"""Extend the selection from the anchor to index.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
index: The index at which the selection ends.
|
|
112
|
+
"""
|
|
113
|
+
return self._entry.selection_to(index)
|
|
114
|
+
|
|
115
|
+
def selection_range(self, first: int | str, last: int | str) -> None:
|
|
116
|
+
"""Select the text between first and last.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
first: Start index (inclusive).
|
|
120
|
+
last: End index (exclusive). Use `'end'` for the last character.
|
|
121
|
+
"""
|
|
122
|
+
return self._entry.selection_range(first, last)
|
|
123
|
+
|
|
124
|
+
def selection_present(self) -> bool:
|
|
125
|
+
"""Return True if any text is currently selected.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
True if a selection exists, False otherwise.
|
|
129
|
+
"""
|
|
130
|
+
return self._entry.selection_present()
|
|
131
|
+
|
|
132
|
+
def selection_all(self) -> None:
|
|
133
|
+
"""Select all text in the entry."""
|
|
134
|
+
return self._entry.selection_range(0, 'end')
|