Как установить Python цвет ползунка шкалы Tkinter? - PullRequest
0 голосов
/ 08 января 2020

Я хочу установить цвет ползунка (часть стрелки), я пробую только многие параметры -background может изменить цвет ползунка.

enter image description here

Но ползунок и фон будет менять цвет вместе, когда я использовал -background, например так:

enter image description here

Если я установил цвет, такой же, как и цвет фона, это вызвало затруднения при поиске слайдер.

Как просто установить цвет слайдера?

Код моей шкалы:

s2 = Scale(control_frame, from_=0, to=100, tickinterval=100, sliderrelief='flat', orient="horizontal", highlightthickness=0, background='black', fg='grey', troughcolor='#73B5FA', activebackground='#1065BF')
s2.place(x=70, y=600, anchor='nw', width = 280, height = 50)

1 Ответ

1 голос
/ 10 января 2020

Чтобы достичь того, что вы хотите, мы должны использовать стиль ttk, поэтому нам нужно использовать ttk.Scale, однако он не принимает все параметры tk.Scale, которые вы используете. Поэтому я предлагаю вам использовать TickScale из модуля ttkwidgets (см. Документацию здесь ). Таким образом, вы можете комбинировать опции tk.Scale со стилем ttk.

Идея состоит в том, чтобы:

  1. создавать изображения нужного цвета для слайдера, например, с помощью tk.PhotoImage:

    img_slider = tk.PhotoImage(width=30, height=15)
    img_slider.put("{<pixel_color> ... <pixel_color>} {<second line>} ...")
    

    Я использовал прямоугольник basi c, но вы также можете загрузить более детальное изображение, если вы будете sh.

  2. создайте цветной элемент темы слайдера:

    style.element_create('custom.Horizontal.Scale.slider', 'image', img_slider,
                         ('active', img_slider_active))
    

    Я также использовал другое изображение img_slider_active, чтобы выделить слайдер, когда на нем находится курсор.

  3. Использование новый элемент в пользовательском стиле

    style.layout('custom.Horizontal.TScale',
                 [('Horizontal.Scale.trough',
                   {'sticky': 'nswe',
                    'children': [('custom.Horizontal.Scale.slider',
                                  {'side': 'left', 'sticky': ''})]})])
    
  4. Примените пользовательский стиль к своему виджету 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()
...