Чтобы достичь того, что вы хотите, мы должны использовать стиль ttk, поэтому нам нужно использовать ttk.Scale
, однако он не принимает все параметры tk.Scale
, которые вы используете. Поэтому я предлагаю вам использовать TickScale
из модуля ttkwidgets (см. Документацию здесь ). Таким образом, вы можете комбинировать опции tk.Scale
со стилем ttk.
Идея состоит в том, чтобы:
создавать изображения нужного цвета для слайдера, например, с помощью tk.PhotoImage
:
img_slider = tk.PhotoImage(width=30, height=15)
img_slider.put("{<pixel_color> ... <pixel_color>} {<second line>} ...")
Я использовал прямоугольник basi c, но вы также можете загрузить более детальное изображение, если вы будете sh.
создайте цветной элемент темы слайдера:
style.element_create('custom.Horizontal.Scale.slider', 'image', img_slider,
('active', img_slider_active))
Я также использовал другое изображение img_slider_active
, чтобы выделить слайдер, когда на нем находится курсор.
Использование новый элемент в пользовательском стиле
style.layout('custom.Horizontal.TScale',
[('Horizontal.Scale.trough',
{'sticky': 'nswe',
'children': [('custom.Horizontal.Scale.slider',
{'side': 'left', 'sticky': ''})]})])
- Примените пользовательский стиль к своему виджету
TickScale
. Так как TickScale
основан на ttk.Scale
, вам нужно использовать стиль, чтобы установить параметры фона, переднего плана и минимального цвета, см. Полный код ниже.
import tkinter as tk
from tkinter import ttk
from ttkwidgets import TickScale
def set_img_color(img, color):
"""Change color of PhotoImage img."""
pixel_line = "{" + " ".join(color for i in range(img.width())) + "}"
pixels = " ".join(pixel_line for i in range(img.height()))
img.put(pixels)
root = tk.Tk()
# create images used for the theme
slider_width = 30
slider_height = 15
# normal slider
img_slider = tk.PhotoImage('img_slider', width=slider_width, height=slider_height, master=root)
set_img_color(img_slider, "red")
# active slider
img_slider_active = tk.PhotoImage('img_slider_active', width=slider_width, height=slider_height, master=root)
set_img_color(img_slider_active, '#1065BF')
style = ttk.Style(root)
style.theme_use('clam')
# create scale element
style.element_create('custom.Horizontal.Scale.slider', 'image', img_slider,
('active', img_slider_active))
# create custom layout
style.layout('custom.Horizontal.TScale',
[('Horizontal.Scale.trough',
{'sticky': 'nswe',
'children': [('custom.Horizontal.Scale.slider',
{'side': 'left', 'sticky': ''})]})])
style.configure('custom.Horizontal.TScale', background='black', foreground='grey',
troughcolor='#73B5FA')
scale = TickScale(root, from_=0, to=100, tickinterval=100, orient="horizontal",
style='custom.Horizontal.TScale')
scale.pack(fill='x')
root.mainloop()