Cambiar la apariencia de una barra de desplazamiento en tkinter (usando estilos ttk)

Me preguntaba si podría ayudarme con un problema de opciones de estilo en ttk. He logrado cambiar la mayoría de los widgets ttk básicos al estilo de mi preferencia. Sólo estoy atascado en cambiar el estilo de una barra de desplazamiento. He buscado durante horas buscando una respuesta, desafortunadamente sin resultado.

Aquí hay un código de ejemplo usando la opción de estilo de la barra de desplazamiento:

import tkinter as tk from tkinter import ttk class Gui: def __init__(self,mainframe): #set the style style = ttk.Style() style.configure('Horizontal.TScrollbar',background = "blue" ) #Create a mainframe self.mainframe = mainframe self.mainframe.title("example") #creating scrollbar frame scrl_attr_frame = ttk.Frame(self.mainframe) scrl_attr_frame.grid(column=0,row=5,sticky="ns") scrl_attr_frame.rowconfigure(0, weight=1) attr_canvas = tk.Canvas(scrl_attr_frame) h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview) attr_canvas.configure(xscrollcommand=h_scroll.set) attr_canvas.grid(column=0,row=0,sticky="ns") h_scroll.grid(column=0, row=1,sticky="we") attr_frame = ttk.Frame(attr_canvas) attr_frame.grid(column=0,row=0,sticky="ns") attr_canvas.create_window((0,0),window=attr_frame, anchor='nw') attr_frame.bind("",lambda event, canvas=attr_canvas : canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200,takefocus=False,highlightthickness=0))#attribute_frame.winfo_height()/20,highlightthickness=0)) #setup treeview widget tree_columns = ("c1", "c2", "c3") self.tree = ttk.Treeview(attr_frame,columns=tree_columns, show="headings",takefocus=False) self.tree.grid(column=0, row=0, sticky='nsew') for head in tree_columns: self.tree.heading(head,text=head,anchor="w") root = tk.Tk() myapp = Gui(root) root.mainloop() 

También probé varias combinaciones incluyendo;

 style.configure('TScrollbar',background='blue') #and style.configure('CustomScroll.Horizontal.TScrollbar',background='blue') #in combination with h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview) h_scroll['style'] = "CustomScroll.Horizontal.TScrollbar" 

¡Muchas gracias por su ayuda!

Parece que solo desea cambiar el canal de una barra de desplazamiento horizontal bajo el tema de Windows. Los widgets ttk se construyen a partir de un conjunto de elementos proporcionados por un motor de diseño y se combinan utilizando el diseño declarado. Bajo Windows, el motor de estilo es la API de estilos visuales de Windows, lo que significa que el progtwigdor no tiene ningún control sobre los colores o las imágenes utilizadas para dibujar la mayoría de los elementos comunes. Windows proporciona el fondo del botón, el canal y los botones de la barra de desplazamiento y el pulgar, e incluso el agarre dibujado dentro del pulgar de la barra de desplazamiento.

Es posible tomar el control de esto para la personalización de la aplicación, pero a un costo de hacer que su aplicación ya no parezca estándar en la plataforma dada. Para hacer esto, debe proporcionar sus propios elementos de UI y definir nuevos diseños de widgets. En última instancia esto puede convertirse en definir tu propio tema. Los scripts tcl en la biblioteca ttk proporcionan buenos ejemplos a seguir e incluso hay algunos temas completos (si son antiguos) que usan mapas de bits para declarar elementos de temas basados ​​en imágenes en la versión original de ttk que se denominó ‘mosaico’.

En este ejemplo específico para obtener una barra de desplazamiento horizontal de Windows con un fondo de color personalizado, necesitamos redefinir el diseño para usar la barra de desplazamiento de los elementos dibujados de Tk. Los elementos utilizados en el tema ‘predeterminado’ pueden copiarse y definirse utilizando parámetros de configuración de estilo y luego son dibujados por Tk y no se pasan a un motor de terceros. El siguiente código genera una barra de desplazamiento como esta que utiliza los botones y el pulgar estándar proporcionados por el motor de diseño vsapi, pero reemplaza el canal. Este canal importado comprende la opción de configuración del estilo troughcolor y, por lo tanto, podemos definir un color para usar ahora. Todas las barras de desplazamiento que usen este estilo usarán el mismo color que el widget en sí mismo, no aceptará una opción de troughcolor. es decir: no puede tener una barra de desplazamiento azul y otra roja a menos que defina un nuevo estilo para cada nuevo color.

introduzca la descripción de la imagen aquí

 from tkinter import * from tkinter.ttk import * def main(): app = Tk() style = Style() # import the 'trough' element from the 'default' engine. style.element_create("My.Horizontal.Scrollbar.trough", "from", "default") # Redefine the horizontal scrollbar layout to use the custom trough. # This one is appropriate for the 'vista' theme. style.layout("My.Horizontal.TScrollbar", [('My.Horizontal.Scrollbar.trough', {'children': [('Horizontal.Scrollbar.leftarrow', {'side': 'left', 'sticky': ''}), ('Horizontal.Scrollbar.rightarrow', {'side': 'right', 'sticky': ''}), ('Horizontal.Scrollbar.thumb', {'unit': '1', 'children': [('Horizontal.Scrollbar.grip', {'sticky': ''})], 'sticky': 'nswe'})], 'sticky': 'we'})]) # Copy original style configuration and add our new custom configuration option. style.configure("My.Horizontal.TScrollbar", *style.configure("Horizontal.TScrollbar")) style.configure("My.Horizontal.TScrollbar", troughcolor="red") # Create and show a widget using the custom style hs = Scrollbar(app, orient="horizontal", style="My.Horizontal.TScrollbar") hs.place(x=5, y=5, width=150) hs.set(0.2,0.3) app.mainloop() if __name__ == '__main__': main() 

Es más fácil si usas el tema clam :

 import tkinter as tk from tkinter import ttk root = tk.Tk() style = ttk.Style() style.theme_use('clam') # 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") hs = ttk.Scrollbar(root, orient="horizontal") hs.place(x=5, y=5, width=150) hs.set(0.2,0.3) root.mainloop() 

Esto no parece ser posible en tkinter en Windows. La siguiente respuesta lo dice: ScrolledText Scrollbar Color (Python Tkinter)

Documentación de la barra de desplazamiento: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/scrollbar.html Campos de estilo admitidos: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ ttk-Scrollbar.html

Intenté pasar sin éxito tanto ‘fondo’ como ‘troughcolor’ en mi máquina Windows. También intenté aplicar el estilo a la barra de desplazamiento general: style.configure (‘TScrollbar’, background = “blue”) Ninguna de mis soluciones funcionó.

Además, otra publicación del foro está de acuerdo en que no puede aplicar estilo al fondo de la barra de desplazamiento aquí: http://www.gossamer-threads.com/lists/python/python/822292