Я нашел вопросы и ответы по изменению статического цвета 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
, но эта поправка не сработала.
@DonalFellows Мне удалось взломать его ... :) Документация tcl помогла.
Я так рад поделиться, что ответ на мой вопрос
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()
Продвинутый стиль программирования! Удачи. (Я всегда был просто счастлив, выбирая стили для конкретной платформы...)