Как изменить динамический внешний вид (т.е. цвет) tkinter ttk.Scrollbar?

Я нашел вопросы и ответы по изменению статического цвета ttk.Scrollbar. Однако я еще не нашел ни одного по изменению его динамического вида, в чем мой вопрос.

Мои сценарии показали, что элементы Vertical.TScrollbar:

моллюск тема:

Stylename = Vertical.TScrollbar
Layout    = [('Vertical.Scrollbar.trough', {'sticky': 'ns', 'children': [('Vertical.Scrollbar.uparrow', {'side': 'top', 'sticky': ''}), ('Vertical.Scrollbar.downarrow', {'side': 'bottom', 'sticky': ''}), ('Vertical.Scrollbar.thumb', {'sticky': 'nswe'})]})]

Element(s) = ['Vertical.Scrollbar.trough', 'Vertical.Scrollbar.uparrow', 'Vertical.Scrollbar.downarrow', 'Vertical.Scrollbar.thumb']

Vertical.Scrollbar.trough      options: ('orient', 'background', 'bordercolor', 'troughcolor', 'lightcolor', 'darkcolor', 'arrowcolor', 'arrowsize', 'gripcount', 'sliderlength')
Vertical.Scrollbar.uparrow     options: ('orient', 'background', 'bordercolor', 'troughcolor', 'lightcolor', 'darkcolor', 'arrowcolor', 'arrowsize', 'gripcount', 'sliderlength')
Vertical.Scrollbar.downarrow   options: ('orient', 'background', 'bordercolor', 'troughcolor', 'lightcolor', 'darkcolor', 'arrowcolor', 'arrowsize', 'gripcount', 'sliderlength')
Vertical.Scrollbar.thumb       options: ('orient', 'background', 'bordercolor', 'troughcolor', 'lightcolor', 'darkcolor', 'arrowcolor', 'arrowsize', 'gripcount', 'sliderlength')

тема по умолчанию:

Stylename = Vertical.TScrollbar
Layout    = [('Vertical.Scrollbar.trough', {'sticky': 'ns', 'children': [('Vertical.Scrollbar.uparrow', {'side': 'top', 'sticky': ''}), ('Vertical.Scrollbar.downarrow', {'side': 'bottom', 'sticky': ''}), ('Vertical.Scrollbar.thumb', {'sticky': 'nswe'})]})]

Element(s) = ['Vertical.Scrollbar.trough', 'Vertical.Scrollbar.uparrow', 'Vertical.Scrollbar.downarrow', 'Vertical.Scrollbar.thumb']

Vertical.Scrollbar.trough      options: ('borderwidth', 'troughcolor', 'troughrelief')
Vertical.Scrollbar.uparrow     options: ('background', 'relief', 'borderwidth', 'arrowcolor', 'arrowsize')
Vertical.Scrollbar.downarrow   options: ('background', 'relief', 'borderwidth', 'arrowcolor', 'arrowsize')
Vertical.Scrollbar.thumb       options: ('orient', 'width', 'relief', 'background', 'borderwidth')

Я попытался изменить динамический цвет его большого пальца, используя:

ss.map("Vertical.TScrollbar", background=[('pressed', "yellow"), ('active', "yellow")])

или

ss.map("Vertical.TScrollbar", thumb=[('pressed', "yellow"), ('active', "yellow")]) 

но эти синтаксисы не работают.

Я хочу, чтобы большой палец полосы прокрутки менял цвет на желтый всякий раз, когда указатель мыши перемещается или нажимает ttk.Scrollbar. Как можно достичь этой цели? Спасибо.

Пример сценария (адаптировано из @Aivar):

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style()
style.theme_use('clam')
# style.theme_use('default')

# list the options of the style
# (Argument should be an element of TScrollbar, eg. "thumb", "trough", ...)
print(style.element_options("Horizontal.TScrollbar.thumb"))

# configure the style
style.configure("Horizontal.TScrollbar", gripcount=0,
                background = "Green", darkcolor = "DarkGreen", lightcolor = "LightGreen",
                troughcolor = "gray", bordercolor = "blue", arrowcolor = "white")

# Syntax A - don't work
style.map("Vertical.TScrollbar.thumb",
          background=[('pressed', "yellow"), ('active', "yellow")],
          bordercolor=[('pressed', "yellow"), ('active', "yellow")],
          troughcolor=[('pressed', "yellow"), ('active', "yellow")],
          lightcolor=[('pressed', "yellow"), ('active', "yellow")],
          darkcolor=[('pressed', "yellow"), ('active', "yellow")],
          )

# Syntax B - don't work either
##style.map("Vertical.TScrollbar",
##          background=[('pressed', "yellow"), ('active', "yellow")],
##          bordercolor=[('pressed', "yellow"), ('active', "yellow")],
##          troughcolor=[('pressed', "yellow"), ('active', "yellow")],
##          lightcolor=[('pressed', "yellow"), ('active', "yellow")],
##          darkcolor=[('pressed', "yellow"), ('active', "yellow")],
##          )


hs = ttk.Scrollbar(root, orient = "horizontal")
hs.place(x=5, y=5, width=150)
hs.set(0.2,0.3)

root.mainloop()

Это полезная документация[1 , 2], по динамическому стилю и ttk.Scrollbar, которую я нашел. В документации tcl упоминается, что динамические состояния ttk.Scrollbar: active, disabled. Я попытался удалить состояние pressed в своем тестовом сценарии, чтобы упоминать только состояние active, но эта поправка не сработала.

Продвинутый стиль программирования! Удачи. (Я всегда был просто счастлив, выбирая стили для конкретной платформы...)

Donal Fellows 17.02.2023 13:36

@DonalFellows Мне удалось взломать его ... :) Документация tcl помогла.

Sun Bear 17.02.2023 15:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я так рад поделиться, что ответ на мой вопрос

style.map("TScrollbar", background=[('active', "yellow")],)

или специально для горизонтальной полосы прокрутки это

style.map("Horizontal.TScrollbar", background=[('active', "yellow")],)

Нашел его после множества различных перестановок, проб и ошибок и после осознания моей опечатки. В сценарии использовался горизонтальный ttk.Scrollbar, но мой стиль упоминал Vertical.TScrollbar. :)

Работает на эти темы 'clam', 'default', 'classic', 'alt'.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style()
# style.theme_use('clam')
# style.theme_use('default')
# style.theme_use('classic')
style.theme_use('alt')

# list the options of the style
# (Argument should be an element of TScrollbar, eg. "thumb", "trough", ...)
print(style.element_options("Horizontal.TScrollbar.thumb"))

# configure the style
style.configure("Horizontal.TScrollbar", gripcount=0,
                background = "Green", darkcolor = "DarkGreen", lightcolor = "LightGreen",
                troughcolor = "gray", bordercolor = "blue", arrowcolor = "white")

# Syntax  - works
style.map("TScrollbar",
          background=[('active', "yellow")],
          bordercolor=[('active', "cyan")],
          troughcolor=[('active', "orange")],
          lightcolor=[('active', "red")],
          darkcolor=[('active', "pink")],
          arrowcolor=[('active', "red")],
          )
print(f"{style.map('TScrollbar')=}")

hs = ttk.Scrollbar(root, orient = "horizontal")
hs.place(x=5, y=5, width=150)
hs.set(0.2,0.3)

root.mainloop()

Другие вопросы по теме