How ro change a Tkinter ScrolledText widget's Scrollbar color?

Question:

I’m using the module ScrolledText in a Tkinter GUI.

I wish to change the colour of the Scrollbar encompassed in the ScrolledText widget, but I’m having some difficulty.

My syntax is correct (according to documentation).

Box = ScrolledText(root)
Box.vbar.config(troughcolor = 'red', bg = 'blue')
Box.pack()

However, the scrollbar still has the standard grey colour.

I know the syntax is correct, because doing other things such as:

 Box.vbar.config(cursor = 'target')   

…works exactly as it should.

However, attempting to change the relief, borderwidth or colors don’t seem to have any effect.
Why is this happening?


Specs:

Python 2.7.1
Tkinter
Windows 7
IDLE

Asked By: Anti Earth

||

Answers:

The Tk Scrollbar widget (vbar) is a native scrollbar in Windows. Its appearance depends on the Windows theme. Consider switching toolkits if it matters; I know PyQt4 will let you style the scrollbar on Windows.

Answered By: Eryk Sun

From what I’ve read it’s really difficult to format scrollbars on Windows. Below is some code for a scrollbar programme which I’ve written. I’m trying to develop some software which should have these kinds of options, but this seems to me like a lot of code for a widget whose main purpose Tkinter does better. However, the programme should allow you to insert images into the arrows, trough and slider as well as change their colour.

from tkinter import *

class App:
    def __init__(self):
        self.t = Text(root)
        self.t.place(x = 50,y = 50,width = 400,height = 400)
        for i in range(300):
            self.t.insert(END,str(i))
            self.t.insert(END,"n")
        self.c = Canvas(root)
        self.c.place(x = 450,y = 50,width = 20,height = 400)
        self.trough = Canvas(self.c,bg = "red")
        self.slider = Label(self.c,bg = "grey")
        self.slidery = 20
        self.sliderh = 200
        self.trough.place(x = 0,y = 20,width = 20,height = 360)
        self.slider.place(x = 0,y = 20,width = 20,height = 200)
        self.up = Label(self.c,bg = "purple")
        self.down = Label(self.c,bg = "purple")
        self.up.place(x = 0,y = 0,width = 20,height = 20)
        self.down.place(x = 0,y = 380,width = 20,height = 20)
        self.up.bind("<Button-1>",self.up_view)
        self.down.bind("<Button-1>",self.down_view)
        self.slider.bind("<Button-1>",self.get_slider)
        self.slider.bind("<B1-Motion>",self.move_slider)
        self.slider.bind("<ButtonRelease-1>",self.release_slider)
        self.trough.bind("<Button-1>",self.next_page)
        self.config_slider()

    def next_page(self,event):
        y = event.y
        top = self.slidery - 20
        bottom = self.slidery + self.sliderh - 20
        coords = self.get_coords()
        if y < top:
            self.up_page(coords)
        if y > bottom:
            self.down_page(coords)

    def up_page(self,coords):
        up = -(coords[1] - coords[0])
        self.t.yview(SCROLL,-1,"pages")
        self.pos_slider()

    def down_page(self,coords):
        down = coords[1] - coords[0]
        self.t.yview(SCROLL,1,"pages")
        self.pos_slider()

    def pos_slider(self):
        coords = self.get_coords()
        self.slidery = (coords[0]/coords[2] * 360) + 20
        self.slider.place(y = self.slidery)

    def config_slider(self):
        coords = self.get_coords()
        top = coords[0]
        bottom = coords[1]
        last = coords[2]
        last -= 1
        if bottom-top < last:
            f = int((bottom-top)/last * 360)
        else:
            f = 360
        if f < 10:
            f = 10
        self.sliderh = f
        self.slider.place(height = f,y = self.slidery)

    def get_coords(self):
        root.update()
        top = self.t.index("@0,0")
        bottom = self.t.index("@0,%d" %self.t.winfo_height())
        last = self.t.index(END)
        t = top.split(".")
        b = bottom.split(".")
        l = last.split(".")
        top = int(t[0])
        bottom = int(b[0])
        last = int(l[0])
        return [top,bottom,last]

    def up_view(self,event):
        self.t.yview(SCROLL,-2,"units")
        self.pos_slider()

    def down_view(self,event):
        self.t.yview(SCROLL,2,"units")
        self.pos_slider()

    def get_slider(self,event):
        self.y = event.y_root
        self.config_slider()

    def move_slider(self,event):
        y = event.y_root - self.y
        y += self.slidery
        if y < 20:
            y = 20
        if y > 380 - self.sliderh:
            y = 380 - self.sliderh
        self.slider.place(y = y)
        self.move_text(y)

    def move_text(self,y):
        coords = self.get_coords()
        y1 = 360 - self.sliderh
        if y1 != 0:            
            prop = (coords[1]-coords[0])/coords[2]
            prop1 = 1-prop
            prop2 = (y-20)/prop1
            f = prop2/360 * prop1
            self.t.yview(MOVETO,f)

    def release_slider(self,event):
        y = event.y_root - self.y + self.slidery
        if y < 20:
            y = 20
        if y > 380 - self.sliderh:
            y = 380 - self.sliderh
        self.slidery = y
        self.slider.place(y = y)
        self.move_text(y)    
        self.config_slider()

root = Tk()
root.geometry("500x500")
app = App()
root.mainloop()
Answered By: my pet monkey

Instead of using Box.vbar.config(troughcolor = 'red', bg = 'blue') change config to configure Box.vbar.configure(troughcolor = 'red', bg = 'blue')

Answered By: Roberto E. Torres