ttkbootstrap 2.2.4__tar.gz → 2.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ttkbootstrap-2.2.4/src/ttkbootstrap.egg-info → ttkbootstrap-2.2.6}/PKG-INFO +1 -1
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/pyproject.toml +1 -1
- ttkbootstrap-2.2.6/src/ttkbootstrap/style/builders/scrollbar.py +250 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/engine.py +1 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/scrolled.py +6 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6/src/ttkbootstrap.egg-info}/PKG-INFO +1 -1
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_scrolled_api.py +21 -0
- ttkbootstrap-2.2.4/src/ttkbootstrap/style/builders/scrollbar.py +0 -234
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/LICENSE +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/MANIFEST.in +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/README.md +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/setup.cfg +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/__init__.pyi +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/__main__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/_pyinstaller/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.ico +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/README.md +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/checkbox-checked.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/checkbox-indeterminate.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/checkbox-unchecked.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/manifest.json +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/progressbar-default.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/progressbar-thin.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/radio.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/sizegrip.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/slider-handle.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/slider-track.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/switch-round.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/switch-square.png +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/icons/LICENSE +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/icons/README.md +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/icons/bootstrap.ttf +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/icons/glyphmap.json +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/icons/icon_metrics.json +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/cli.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/colorutils.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/constants.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/convert_theme.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/base.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/colorchooser.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/colordropper.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/datepicker.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/filedialog.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/fontdialog.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/message.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/dialogs/query.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/busy.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/configure_delegation.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/positioning.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/publisher.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/utility.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/internal/wheel.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/localization/README.md +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/localization/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/localization/api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/localization/msgcat.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/localization/msgs.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/menu.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/publisher.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/py.typed +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/_compat.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/assets.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/bootstyle.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/button.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/calendar.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/checkbutton.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/combobox.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/entry.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/floodgauge.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/frame.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/label.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/labelframe.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/menubutton.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/notebook.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/panedwindow.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/progressbar.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/radiobutton.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/registry.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/scale.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/separator.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/sizegrip.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/spinbox.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/toggle.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/toolbutton.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/treeview.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders/utils.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders_tk.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/builders_ttk.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/elements.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/icons.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/layout.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/scaling.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/style/theme.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/themes/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/themes/builtin.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/themes/legacy.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/themes/standard.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utility.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/color.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/config.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/fonts.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/platform.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/utils/scaling.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/validation.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/dateentry.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/floodgauge.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/labeledscale.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/meter.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/tableview.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/toast.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/widgets/tooltip.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/window.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap.egg-info/SOURCES.txt +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap.egg-info/dependency_links.txt +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap.egg-info/entry_points.txt +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap.egg-info/requires.txt +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap.egg-info/top_level.txt +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkcreator/__init__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkcreator/__main__.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_bootstyle_grammar.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_bootstyle_value_tokens.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_busy_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_cli_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_config_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_configure_delegation.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_convert_theme.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_dateentry_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_dialogs_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_durable_style_options.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_filedialog_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_floodgauge_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_fonts_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_icon_drop.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_icon_theme.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_labeledscale_tooltip_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_menu_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_menu_border.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_meter_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_mixin_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_pyinstaller_hook.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_scaling.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_scroll_events.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_style_package.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_style_reference.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_surface_color.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_surface_families.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_surface_grammar.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_tableview_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_toast_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_toolkit.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_treeview_rowheight.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_utility_api.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_widget_catalog_coverage.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_widget_reexports.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_widget_stubs.py +0 -0
- {ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/tests/test_window_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ttkbootstrap
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.6
|
|
4
4
|
Summary: Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ttkbootstrap"
|
|
7
|
-
version = "2.2.
|
|
7
|
+
version = "2.2.6"
|
|
8
8
|
description = "Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"""TTK scrollbar style recipes."""
|
|
2
|
+
|
|
3
|
+
import tkinter as tk
|
|
4
|
+
|
|
5
|
+
from ttkbootstrap.constants import *
|
|
6
|
+
from ttkbootstrap.style import StyleBuilderTTK
|
|
7
|
+
from ttkbootstrap.style.layout import El, image_element, layout, state_map
|
|
8
|
+
from ttkbootstrap.style.builders.registry import register_builder
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# A few-pixel thumb for the 'thin' variant -- suits narrow lists/dropdowns.
|
|
12
|
+
_THIN_SCROLLBAR_THICKNESS = 4
|
|
13
|
+
_THIN_SCROLLBAR_MIN_THUMB = 8 # minimum thumb length (logical)
|
|
14
|
+
|
|
15
|
+
# The standard scrollbar thumb thickness (square + round variants).
|
|
16
|
+
_SCROLLBAR_THICKNESS = 8
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _scrollbar_trough(builder):
|
|
20
|
+
"""The scrollbar track color: the surface, so the thumb floats with no
|
|
21
|
+
visible channel around it. Honors the 2.0 surface-color token (default ==
|
|
22
|
+
theme bg)."""
|
|
23
|
+
return builder.resolve_surface(builder._surface)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _scrollbar_thumb_color(builder, colorname):
|
|
27
|
+
"""The default (neutral) thumb color, or the accent when a color is given.
|
|
28
|
+
|
|
29
|
+
In light mode the raw border color is too pale to read against the near-white
|
|
30
|
+
trough, so darken it to a clearly visible mid-gray; dark mode's `selectbg`
|
|
31
|
+
already reads against the dark trough.
|
|
32
|
+
"""
|
|
33
|
+
if colorname in (DEFAULT, ""):
|
|
34
|
+
if builder.is_light_theme:
|
|
35
|
+
return builder.shade(builder.colors.border, 0.25)
|
|
36
|
+
return builder.colors.selectbg
|
|
37
|
+
return builder.colors.get(colorname)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Trough margin (logical px) left on each side of the thumb, so the visible
|
|
41
|
+
# trough shows around it. Applied as the thumb's cross-axis padding.
|
|
42
|
+
_SCROLLBAR_THUMB_INSET = 1
|
|
43
|
+
_SCROLLBAR_MIN_THUMB = 16 # minimum thumb length (logical) so it stays grabbable
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _scrollbar_cap(builder, color, trough, orient, end, thickness, length, rounded):
|
|
47
|
+
"""One end cap of the thumb: `thickness` across the bar, `length` along it.
|
|
48
|
+
|
|
49
|
+
A round cap is drawn flattened onto the trough color, so the image has no
|
|
50
|
+
transparency: on X11 Tk draws a photo with alpha by reading the window
|
|
51
|
+
back to blend it, a server round trip per draw.
|
|
52
|
+
"""
|
|
53
|
+
a = builder.assets
|
|
54
|
+
size = (thickness, length) if orient == "vertical" else (length, thickness)
|
|
55
|
+
if not rounded:
|
|
56
|
+
return a.rect(color, size)
|
|
57
|
+
|
|
58
|
+
def draw(d, w, h):
|
|
59
|
+
d.rectangle((0, 0, w - 1, h - 1), fill=trough)
|
|
60
|
+
# a pill that overhangs the inner edge, so only its rounded end shows
|
|
61
|
+
if orient == "vertical":
|
|
62
|
+
box = [0, 0, w - 1, h - 1 + w] if end == "start" else [0, -w, w - 1, h - 1]
|
|
63
|
+
radius = round(w / 2)
|
|
64
|
+
else:
|
|
65
|
+
box = [0, 0, w - 1 + h, h - 1] if end == "start" else [-h, 0, w - 1, h - 1]
|
|
66
|
+
radius = round(h / 2)
|
|
67
|
+
d.rounded_rectangle(box, radius=radius, fill=color)
|
|
68
|
+
|
|
69
|
+
return a.image(size, draw, "scrollbar-cap", color, trough, orient, end)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _scrollbar_thumb(builder, ttk_style, orient, thumb, trough, *,
|
|
73
|
+
thickness, inset, cap, rounded):
|
|
74
|
+
"""Build the thumb elements of `ttk_style`; returns the thumb layout node.
|
|
75
|
+
|
|
76
|
+
The thumb is a `padding` element (the cross-axis inset) holding a cap image
|
|
77
|
+
at each end around a solid fill that stretches with the thumb. Only the
|
|
78
|
+
caps are images: ttk *tiles* the middle of an image element rather than
|
|
79
|
+
stretching it, so a 9-sliced image thumb is redrawn from tiles once per
|
|
80
|
+
pixel of its length, while the fill is one rectangle at any length. The
|
|
81
|
+
two caps also set the minimum thumb length.
|
|
82
|
+
|
|
83
|
+
The fill is the default theme's `field` element (flat at borderwidth 0),
|
|
84
|
+
colored by `fieldbackground` -- an option nothing else on a scrollbar
|
|
85
|
+
reads, so `background` stays the trough color like every other region.
|
|
86
|
+
|
|
87
|
+
The children are named `*.thumb` on purpose: Tk's scrollbar bindings
|
|
88
|
+
(library/ttk/scrollbar.tcl) decide whether a press starts a drag with
|
|
89
|
+
`switch -glob -- [$w identify $x $y] { *thumb {...} *trough {...} }`, and
|
|
90
|
+
`identify` returns the *innermost* element under the pointer. Named
|
|
91
|
+
`.fill` / `.startcap` / `.endcap`, they match neither pattern, so pressing
|
|
92
|
+
the thumb does nothing and only trough clicks work. Ending the names in
|
|
93
|
+
`thumb` keeps every part of the thumb draggable.
|
|
94
|
+
"""
|
|
95
|
+
vertical = orient == "vertical"
|
|
96
|
+
scaling = builder.style.scaling
|
|
97
|
+
pad = scaling.logical(inset)
|
|
98
|
+
# Size the cap from the full thickness: rounding the inset and the cap
|
|
99
|
+
# separately would add a pixel to the bar at fractional scaling. The
|
|
100
|
+
# physical width is passed back in logical units, which the asset toolkit
|
|
101
|
+
# rounds to the same pixel count.
|
|
102
|
+
cap_thickness = (scaling.logical(thickness) - 2 * pad) / scaling.factor
|
|
103
|
+
builder.configure(ttk_style, fieldbackground=thumb, focuswidth=0,
|
|
104
|
+
padding=(pad, 0) if vertical else (0, pad))
|
|
105
|
+
state_map(builder.style, ttk_style, fieldbackground={
|
|
106
|
+
"pressed": builder.pressed(thumb), "active": builder.active(thumb)})
|
|
107
|
+
|
|
108
|
+
builder.style.element_create(f"{ttk_style}.thumb", "from", TTK_DEFAULT, "padding")
|
|
109
|
+
builder.style.element_create(f"{ttk_style}.fill.thumb", "from", TTK_DEFAULT, "field")
|
|
110
|
+
cap_sticky = "ew" if vertical else "ns"
|
|
111
|
+
for end in ("start", "end"):
|
|
112
|
+
def image(color):
|
|
113
|
+
return _scrollbar_cap(builder, color, trough, orient, end,
|
|
114
|
+
cap_thickness, cap, rounded)
|
|
115
|
+
image_element(
|
|
116
|
+
builder.style, f"{ttk_style}.{end}cap.thumb", default=image(thumb),
|
|
117
|
+
states={"pressed": image(builder.pressed(thumb)),
|
|
118
|
+
"active": image(builder.active(thumb))},
|
|
119
|
+
sticky=cap_sticky)
|
|
120
|
+
|
|
121
|
+
start_side, end_side = ("top", "bottom") if vertical else ("left", "right")
|
|
122
|
+
return El(f"{ttk_style}.thumb", expand="1", sticky="ns" if vertical else "we",
|
|
123
|
+
children=[
|
|
124
|
+
El(f"{ttk_style}.startcap.thumb", side=start_side, sticky=cap_sticky),
|
|
125
|
+
El(f"{ttk_style}.endcap.thumb", side=end_side, sticky=cap_sticky),
|
|
126
|
+
El(f"{ttk_style}.fill.thumb", sticky="nswe")])
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _build_scrollbar(builder: StyleBuilderTTK, colorname, rounded):
|
|
130
|
+
"""Build the horizontal + vertical scrollbar styles (square or round).
|
|
131
|
+
|
|
132
|
+
A subtle visible trough (every region shares the trough color, so the whole
|
|
133
|
+
widget reads as one track) with an inset thumb, no arrows.
|
|
134
|
+
"""
|
|
135
|
+
ttk_class = "TScrollbar"
|
|
136
|
+
prefix = "Round." if rounded else ""
|
|
137
|
+
trough = _scrollbar_trough(builder)
|
|
138
|
+
thumb = _scrollbar_thumb_color(builder, colorname)
|
|
139
|
+
|
|
140
|
+
if colorname in (DEFAULT, ""):
|
|
141
|
+
base = prefix
|
|
142
|
+
else:
|
|
143
|
+
base = f"{colorname}.{prefix}"
|
|
144
|
+
|
|
145
|
+
for orient, sticky, trough_el in (
|
|
146
|
+
("horizontal", "we", "Horizontal.Scrollbar.trough"),
|
|
147
|
+
("vertical", "ns", "Vertical.Scrollbar.trough"),
|
|
148
|
+
):
|
|
149
|
+
axis = "Horizontal" if orient == "horizontal" else "Vertical"
|
|
150
|
+
ttk_style = builder.surface_prefix(f"{base}{axis}.{ttk_class}")
|
|
151
|
+
builder.configure(
|
|
152
|
+
ttk_style,
|
|
153
|
+
troughcolor=trough,
|
|
154
|
+
bordercolor=trough,
|
|
155
|
+
background=trough,
|
|
156
|
+
darkcolor=trough,
|
|
157
|
+
lightcolor=trough,
|
|
158
|
+
relief=tk.FLAT,
|
|
159
|
+
borderwidth=0,
|
|
160
|
+
arrowsize=0,
|
|
161
|
+
)
|
|
162
|
+
thumb_el = _scrollbar_thumb(
|
|
163
|
+
builder, ttk_style, orient, thumb, trough,
|
|
164
|
+
thickness=_SCROLLBAR_THICKNESS, inset=_SCROLLBAR_THUMB_INSET,
|
|
165
|
+
cap=_SCROLLBAR_MIN_THUMB // 2, rounded=rounded)
|
|
166
|
+
layout(builder.style, ttk_style,
|
|
167
|
+
El(trough_el, sticky=sticky, children=[thumb_el]))
|
|
168
|
+
builder.register_ttkstyle(ttk_style)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@register_builder("thin", "scrollbar")
|
|
172
|
+
def build_thin_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
173
|
+
"""Create a thin scrollbar style for the ttk.Scrollbar widget.
|
|
174
|
+
|
|
175
|
+
A few-pixel flat thumb on a surface-matched track, no arrows -- for narrow
|
|
176
|
+
lists and dropdowns where the bar is more a scroll *indicator* than a drag
|
|
177
|
+
handle (combobox popdown, font picker, ...). The thumb shares the neutral/
|
|
178
|
+
accent color of the standard bar (`_scrollbar_thumb_color`) and darkens/
|
|
179
|
+
lightens on hover/press. Ported from bootstack (mechanism, not API): a solid
|
|
180
|
+
box thumb rather than a rounded PNG.
|
|
181
|
+
|
|
182
|
+
Parameters:
|
|
183
|
+
|
|
184
|
+
builder (StyleBuilderTTK):
|
|
185
|
+
The style builder
|
|
186
|
+
colorname (str):
|
|
187
|
+
The color label used to style the widget.
|
|
188
|
+
"""
|
|
189
|
+
ttk_class = "TScrollbar"
|
|
190
|
+
# The surface the bar sits on (2.0 surface-color); default == theme bg.
|
|
191
|
+
surface = builder.resolve_surface(builder._surface)
|
|
192
|
+
# share the darker, clearly-visible thumb color with the default/round bars
|
|
193
|
+
thumb = _scrollbar_thumb_color(builder, colorname)
|
|
194
|
+
|
|
195
|
+
if any([colorname == DEFAULT, colorname == ""]):
|
|
196
|
+
prefix = "Thin."
|
|
197
|
+
else:
|
|
198
|
+
prefix = f"{colorname}.Thin."
|
|
199
|
+
|
|
200
|
+
for orient, sticky, trough_el in (
|
|
201
|
+
("horizontal", "we", "Horizontal.Scrollbar.trough"),
|
|
202
|
+
("vertical", "ns", "Vertical.Scrollbar.trough"),
|
|
203
|
+
):
|
|
204
|
+
axis = "Horizontal" if orient == "horizontal" else "Vertical"
|
|
205
|
+
ttk_style = builder.surface_prefix(f"{prefix}{axis}.{ttk_class}")
|
|
206
|
+
builder.configure(
|
|
207
|
+
ttk_style,
|
|
208
|
+
troughcolor=surface,
|
|
209
|
+
bordercolor=surface,
|
|
210
|
+
background=surface,
|
|
211
|
+
relief=tk.FLAT,
|
|
212
|
+
borderwidth=0,
|
|
213
|
+
arrowsize=0,
|
|
214
|
+
)
|
|
215
|
+
# a `t`-px-thick sliver that stretches along the track
|
|
216
|
+
thumb_el = _scrollbar_thumb(
|
|
217
|
+
builder, ttk_style, orient, thumb, surface,
|
|
218
|
+
thickness=_THIN_SCROLLBAR_THICKNESS, inset=0,
|
|
219
|
+
cap=_THIN_SCROLLBAR_MIN_THUMB // 2, rounded=False)
|
|
220
|
+
layout(builder.style, ttk_style,
|
|
221
|
+
El(trough_el, sticky=sticky, children=[thumb_el]))
|
|
222
|
+
builder.register_ttkstyle(ttk_style)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@register_builder("round", "scrollbar")
|
|
226
|
+
def build_round_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
227
|
+
"""Create a round style for the ttk.Scrollbar widget.
|
|
228
|
+
|
|
229
|
+
Parameters:
|
|
230
|
+
|
|
231
|
+
builder (StyleBuilderTTK):
|
|
232
|
+
The style builder
|
|
233
|
+
colorname (str):
|
|
234
|
+
The color label used to style the widget.
|
|
235
|
+
"""
|
|
236
|
+
_build_scrollbar(builder, colorname, rounded=True)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
@register_builder("default", "scrollbar")
|
|
240
|
+
def build_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
241
|
+
"""Create a standard style for the ttk.Scrollbar widget.
|
|
242
|
+
|
|
243
|
+
Parameters:
|
|
244
|
+
|
|
245
|
+
builder (StyleBuilderTTK):
|
|
246
|
+
The style builder.
|
|
247
|
+
colorname (str):
|
|
248
|
+
The color label used to style the widget.
|
|
249
|
+
"""
|
|
250
|
+
_build_scrollbar(builder, colorname, rounded=False)
|
|
@@ -413,6 +413,12 @@ class ScrolledFrame(ttk.Frame):
|
|
|
413
413
|
)
|
|
414
414
|
self._vbar.grid(row=0, column=1, sticky=NS)
|
|
415
415
|
self._canvas.configure(yscrollcommand=self._vbar.set)
|
|
416
|
+
# Reserve the scrollbar's lane so auto-hide (grid_remove/grid on hover)
|
|
417
|
+
# doesn't widen the canvas -- and reflow the content -- when the bar
|
|
418
|
+
# comes and goes. Same as ScrolledText.
|
|
419
|
+
self.container.grid_columnconfigure(
|
|
420
|
+
1, minsize=self._vbar.winfo_reqwidth()
|
|
421
|
+
)
|
|
416
422
|
|
|
417
423
|
# content frame lives inside the canvas -> native scroll fractions +
|
|
418
424
|
# native destroy cascade.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ttkbootstrap
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.6
|
|
4
4
|
Summary: Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease.
|
|
5
5
|
Author-email: Israel Dryer <israel.dryer@gmail.com>
|
|
6
6
|
License-Expression: MIT AND (Apache-2.0 OR BSD-2-Clause)
|
|
@@ -221,6 +221,27 @@ def test_scrolledtext_autohide_does_not_resize_the_frame(root):
|
|
|
221
221
|
assert st._border.winfo_reqheight() == h_shown
|
|
222
222
|
|
|
223
223
|
|
|
224
|
+
def test_scrolledframe_autohide_does_not_reflow_the_content(root):
|
|
225
|
+
# Regression (#1352): hiding the scrollbar collapsed its grid column, so the
|
|
226
|
+
# canvas widened and the content reflowed by the bar's width on every hover
|
|
227
|
+
# crossing. Its lane is now reserved, as in ScrolledText.
|
|
228
|
+
holder = ttk.Frame(root, width=300, height=200)
|
|
229
|
+
holder.pack_propagate(False)
|
|
230
|
+
holder.pack()
|
|
231
|
+
sf = ScrolledFrame(holder, auto_hide=True)
|
|
232
|
+
sf.pack(fill="both", expand=True)
|
|
233
|
+
for i in range(30):
|
|
234
|
+
ttk.Label(sf, text=f"row {i}").pack(anchor="w")
|
|
235
|
+
sf.show_scrollbars()
|
|
236
|
+
sf.update_idletasks()
|
|
237
|
+
# the content window is sized to the canvas, so a stable canvas is a
|
|
238
|
+
# stable content width
|
|
239
|
+
shown = sf._canvas.winfo_width()
|
|
240
|
+
sf.hide_scrollbars()
|
|
241
|
+
sf.update_idletasks()
|
|
242
|
+
assert sf._canvas.winfo_width() == shown
|
|
243
|
+
|
|
244
|
+
|
|
224
245
|
def test_scrolledtext_focus_drives_the_border_state(root):
|
|
225
246
|
# The border ring is a ttk state map on the highlight frame; focus toggles
|
|
226
247
|
# the frame's `focus` state rather than swapping the style name.
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
"""TTK scrollbar style recipes."""
|
|
2
|
-
|
|
3
|
-
import tkinter as tk
|
|
4
|
-
|
|
5
|
-
from ttkbootstrap.constants import *
|
|
6
|
-
from ttkbootstrap.style import StyleBuilderTTK
|
|
7
|
-
from ttkbootstrap.style.layout import El, image_element, layout
|
|
8
|
-
from ttkbootstrap.style.builders.registry import register_builder
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
# A few-pixel thumb for the 'thin' variant -- suits narrow lists/dropdowns.
|
|
12
|
-
_THIN_SCROLLBAR_THICKNESS = 4
|
|
13
|
-
|
|
14
|
-
# The standard scrollbar thumb thickness (square + round variants).
|
|
15
|
-
_SCROLLBAR_THICKNESS = 8
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def _scrollbar_trough(builder):
|
|
19
|
-
"""The scrollbar track color: the surface, so the thumb floats with no
|
|
20
|
-
visible channel around it. Honors the 2.0 surface-color token (default ==
|
|
21
|
-
theme bg)."""
|
|
22
|
-
return builder.resolve_surface(builder._surface)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def _scrollbar_thumb_color(builder, colorname):
|
|
26
|
-
"""The default (neutral) thumb color, or the accent when a color is given.
|
|
27
|
-
|
|
28
|
-
In light mode the raw border color is too pale to read against the near-white
|
|
29
|
-
trough, so darken it to a clearly visible mid-gray; dark mode's `selectbg`
|
|
30
|
-
already reads against the dark trough.
|
|
31
|
-
"""
|
|
32
|
-
if colorname in (DEFAULT, ""):
|
|
33
|
-
if builder.is_light_theme:
|
|
34
|
-
return builder.shade(builder.colors.border, 0.25)
|
|
35
|
-
return builder.colors.selectbg
|
|
36
|
-
return builder.colors.get(colorname)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
# Trough margin (logical px) left on each side of the thumb, so the visible
|
|
40
|
-
# trough shows around it. Baked into the thumb image (a transparent margin) --
|
|
41
|
-
# ttk's trough borderwidth doesn't reliably inset an image thumb.
|
|
42
|
-
_SCROLLBAR_THUMB_INSET = 1
|
|
43
|
-
_SCROLLBAR_MIN_THUMB = 16 # minimum thumb length (logical) so it stays grabbable
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def _scrollbar_thumb(builder, color, orient, rounded):
|
|
47
|
-
"""A thumb image with a transparent cross-axis margin, so the trough shows
|
|
48
|
-
around it. Returns (image_name, border) for `image_element`.
|
|
49
|
-
|
|
50
|
-
Square thumbs are a solid rect that stretches uniformly (border 0); round
|
|
51
|
-
thumbs are a capped pill 9-sliced along the length so the caps don't
|
|
52
|
-
distort when the thumb stretches.
|
|
53
|
-
"""
|
|
54
|
-
a = builder.assets
|
|
55
|
-
inset = _SCROLLBAR_THUMB_INSET
|
|
56
|
-
t = _SCROLLBAR_THICKNESS
|
|
57
|
-
cross = 0 if orient == "vertical" else 1 # x for vertical, y for horizontal
|
|
58
|
-
|
|
59
|
-
def draw(d, w, h):
|
|
60
|
-
dims = (w, h)
|
|
61
|
-
margin = round(dims[cross] * inset / t)
|
|
62
|
-
box = [0, 0, w - 1, h - 1]
|
|
63
|
-
box[cross] += margin
|
|
64
|
-
box[cross + 2] -= margin
|
|
65
|
-
if rounded:
|
|
66
|
-
radius = round((dims[cross] - 2 * margin) / 2)
|
|
67
|
-
d.rounded_rectangle(box, radius=radius, fill=color)
|
|
68
|
-
else:
|
|
69
|
-
d.rectangle(box, fill=color)
|
|
70
|
-
|
|
71
|
-
# A 9-slice border sets the *minimum* thumb length -- its fixed end regions
|
|
72
|
-
# can't shrink -- so a long list (e.g. the font family picker) can't squash
|
|
73
|
-
# the thumb to a microscopic sliver. For the round thumb those end regions
|
|
74
|
-
# also hold the rounded caps.
|
|
75
|
-
cap = builder.scale_size(_SCROLLBAR_MIN_THUMB // 2)
|
|
76
|
-
length = _SCROLLBAR_MIN_THUMB + 1
|
|
77
|
-
if orient == "vertical":
|
|
78
|
-
size = (t, length)
|
|
79
|
-
border = (0, cap)
|
|
80
|
-
else:
|
|
81
|
-
size = (length, t)
|
|
82
|
-
border = (cap, 0)
|
|
83
|
-
return a.image(size, draw, "scrollbar-thumb", color, orient, rounded), border
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _build_scrollbar(builder: StyleBuilderTTK, colorname, rounded):
|
|
87
|
-
"""Build the horizontal + vertical scrollbar styles (square or round).
|
|
88
|
-
|
|
89
|
-
A subtle visible trough (every region shares the trough color, so the whole
|
|
90
|
-
widget reads as one track) with an inset thumb, no arrows.
|
|
91
|
-
"""
|
|
92
|
-
ttk_class = "TScrollbar"
|
|
93
|
-
prefix = "Round." if rounded else ""
|
|
94
|
-
trough = _scrollbar_trough(builder)
|
|
95
|
-
thumb = _scrollbar_thumb_color(builder, colorname)
|
|
96
|
-
pressed = builder.pressed(thumb)
|
|
97
|
-
active = builder.active(thumb)
|
|
98
|
-
|
|
99
|
-
if colorname in (DEFAULT, ""):
|
|
100
|
-
base = prefix
|
|
101
|
-
else:
|
|
102
|
-
base = f"{colorname}.{prefix}"
|
|
103
|
-
|
|
104
|
-
for orient, sticky, trough_el in (
|
|
105
|
-
("horizontal", "we", "Horizontal.Scrollbar.trough"),
|
|
106
|
-
("vertical", "ns", "Vertical.Scrollbar.trough"),
|
|
107
|
-
):
|
|
108
|
-
axis = "Horizontal" if orient == "horizontal" else "Vertical"
|
|
109
|
-
ttk_style = builder.surface_prefix(f"{base}{axis}.{ttk_class}")
|
|
110
|
-
builder.configure(
|
|
111
|
-
ttk_style,
|
|
112
|
-
troughcolor=trough,
|
|
113
|
-
bordercolor=trough,
|
|
114
|
-
background=trough,
|
|
115
|
-
darkcolor=trough,
|
|
116
|
-
lightcolor=trough,
|
|
117
|
-
relief=tk.FLAT,
|
|
118
|
-
borderwidth=0,
|
|
119
|
-
arrowsize=0,
|
|
120
|
-
)
|
|
121
|
-
normal, border = _scrollbar_thumb(builder, thumb, orient, rounded)
|
|
122
|
-
pressed_img, _ = _scrollbar_thumb(builder, pressed, orient, rounded)
|
|
123
|
-
active_img, _ = _scrollbar_thumb(builder, active, orient, rounded)
|
|
124
|
-
image_element(
|
|
125
|
-
builder.style, f"{ttk_style}.thumb", default=normal,
|
|
126
|
-
states={"pressed": pressed_img, "active": active_img},
|
|
127
|
-
border=border, sticky=sticky)
|
|
128
|
-
layout(builder.style, ttk_style,
|
|
129
|
-
El(trough_el, sticky=sticky, children=[
|
|
130
|
-
El(f"{ttk_style}.thumb", expand="1", sticky=sticky)]))
|
|
131
|
-
builder.register_ttkstyle(ttk_style)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
@register_builder("thin", "scrollbar")
|
|
135
|
-
def build_thin_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
136
|
-
"""Create a thin scrollbar style for the ttk.Scrollbar widget.
|
|
137
|
-
|
|
138
|
-
A few-pixel flat thumb on a surface-matched track, no arrows -- for narrow
|
|
139
|
-
lists and dropdowns where the bar is more a scroll *indicator* than a drag
|
|
140
|
-
handle (combobox popdown, font picker, ...). The thumb shares the neutral/
|
|
141
|
-
accent color of the standard bar (`_scrollbar_thumb_color`) and darkens/
|
|
142
|
-
lightens on hover/press. Ported from bootstack (mechanism, not API): a solid
|
|
143
|
-
box thumb via the `rect` toolkit rather than a rounded PNG.
|
|
144
|
-
|
|
145
|
-
Parameters:
|
|
146
|
-
|
|
147
|
-
builder (StyleBuilderTTK):
|
|
148
|
-
The style builder
|
|
149
|
-
colorname (str):
|
|
150
|
-
The color label used to style the widget.
|
|
151
|
-
"""
|
|
152
|
-
ttk_class = "TScrollbar"
|
|
153
|
-
# The surface the bar sits on (2.0 surface-color); default == theme bg.
|
|
154
|
-
surface = builder.resolve_surface(builder._surface)
|
|
155
|
-
|
|
156
|
-
if any([colorname == DEFAULT, colorname == ""]):
|
|
157
|
-
h_ttk_style = builder.surface_prefix(f"Thin.Horizontal.{ttk_class}")
|
|
158
|
-
v_ttk_style = builder.surface_prefix(f"Thin.Vertical.{ttk_class}")
|
|
159
|
-
else:
|
|
160
|
-
h_ttk_style = builder.surface_prefix(f"{colorname}.Thin.Horizontal.{ttk_class}")
|
|
161
|
-
v_ttk_style = builder.surface_prefix(f"{colorname}.Thin.Vertical.{ttk_class}")
|
|
162
|
-
# share the darker, clearly-visible thumb color with the default/round bars
|
|
163
|
-
thumb = _scrollbar_thumb_color(builder, colorname)
|
|
164
|
-
|
|
165
|
-
active = builder.active(thumb)
|
|
166
|
-
pressed = builder.pressed(thumb)
|
|
167
|
-
a = builder.assets
|
|
168
|
-
t = _THIN_SCROLLBAR_THICKNESS
|
|
169
|
-
|
|
170
|
-
def _configure(ttk_style):
|
|
171
|
-
builder.configure(
|
|
172
|
-
ttk_style,
|
|
173
|
-
troughcolor=surface,
|
|
174
|
-
bordercolor=surface,
|
|
175
|
-
background=surface,
|
|
176
|
-
relief=tk.FLAT,
|
|
177
|
-
borderwidth=0,
|
|
178
|
-
arrowsize=0,
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
# horizontal: a `t`-px-thick sliver that stretches along the track (EW)
|
|
182
|
-
_configure(h_ttk_style)
|
|
183
|
-
image_element(
|
|
184
|
-
builder.style, f"{h_ttk_style}.thumb",
|
|
185
|
-
default=a.rect(thumb, (8, t)),
|
|
186
|
-
states={"pressed": a.rect(pressed, (8, t)),
|
|
187
|
-
"active": a.rect(active, (8, t))},
|
|
188
|
-
border=0, sticky="ew")
|
|
189
|
-
layout(builder.style, h_ttk_style,
|
|
190
|
-
El("Horizontal.Scrollbar.trough", sticky="we", children=[
|
|
191
|
-
El(f"{h_ttk_style}.thumb", expand="1", sticky="we")]))
|
|
192
|
-
|
|
193
|
-
# vertical
|
|
194
|
-
_configure(v_ttk_style)
|
|
195
|
-
image_element(
|
|
196
|
-
builder.style, f"{v_ttk_style}.thumb",
|
|
197
|
-
default=a.rect(thumb, (t, 8)),
|
|
198
|
-
states={"pressed": a.rect(pressed, (t, 8)),
|
|
199
|
-
"active": a.rect(active, (t, 8))},
|
|
200
|
-
border=0, sticky="ns")
|
|
201
|
-
layout(builder.style, v_ttk_style,
|
|
202
|
-
El("Vertical.Scrollbar.trough", sticky="ns", children=[
|
|
203
|
-
El(f"{v_ttk_style}.thumb", expand="1", sticky="ns")]))
|
|
204
|
-
|
|
205
|
-
builder.register_ttkstyle(h_ttk_style)
|
|
206
|
-
builder.register_ttkstyle(v_ttk_style)
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
@register_builder("round", "scrollbar")
|
|
210
|
-
def build_round_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
211
|
-
"""Create a round style for the ttk.Scrollbar widget.
|
|
212
|
-
|
|
213
|
-
Parameters:
|
|
214
|
-
|
|
215
|
-
builder (StyleBuilderTTK):
|
|
216
|
-
The style builder
|
|
217
|
-
colorname (str):
|
|
218
|
-
The color label used to style the widget.
|
|
219
|
-
"""
|
|
220
|
-
_build_scrollbar(builder, colorname, rounded=True)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
@register_builder("default", "scrollbar")
|
|
224
|
-
def build_scrollbar_style(builder: StyleBuilderTTK, colorname=DEFAULT):
|
|
225
|
-
"""Create a standard style for the ttk.Scrollbar widget.
|
|
226
|
-
|
|
227
|
-
Parameters:
|
|
228
|
-
|
|
229
|
-
builder (StyleBuilderTTK):
|
|
230
|
-
The style builder.
|
|
231
|
-
colorname (str):
|
|
232
|
-
The color label used to style the widget.
|
|
233
|
-
"""
|
|
234
|
-
_build_scrollbar(builder, colorname, rounded=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/_pyinstaller/hook-ttkbootstrap.py
RENAMED
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.ico
RENAMED
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/app_icons/ttkbootstrap.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/checkbox-checked.png
RENAMED
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/checkbox-unchecked.png
RENAMED
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/progressbar-default.png
RENAMED
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/progressbar-thin.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/slider-handle.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ttkbootstrap-2.2.4 → ttkbootstrap-2.2.6}/src/ttkbootstrap/assets/elements/switch-square.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|