如何更改Tkinter ScrolledText小部件的滚动条颜色?

1 投票
3 回答
8560 浏览
提问于 2025-04-16 23:01

我在使用Tkinter图形界面中的ScrolledText模块。

我想改变ScrolledText小部件里面的Scrollbar的颜色,但遇到了一些困难。

我的语法是正确的(根据文档来看)。

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

可是,滚动条还是保持着标准的灰色。

我知道语法没问题,因为做其他事情,比如:

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

...都能正常工作。

但是,尝试改变reliefborderwidth或者颜色似乎没有任何效果。
这是什么原因呢?


规格:

Python 2.7.1
Tkinter
Windows 7
IDLE

3 个回答

0

不要用 Box.vbar.config(troughcolor = 'red', bg = 'blue') 这个写法,改成 Box.vbar.configure(troughcolor = 'red', bg = 'blue') 这样来设置。

3

根据我所了解,在Windows上格式化滚动条真的很困难。下面是我写的一个滚动条程序的代码。我正在尝试开发一些软件,应该有这些选项,但对我来说,这段代码似乎有点多,因为Tkinter已经能更好地完成这个小部件的主要功能。不过,这个程序应该允许你在箭头、轨道和滑块中插入图片,并且可以改变它们的颜色。

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()
4

Tk的滚动条组件(vbar)是Windows系统自带的滚动条。它的外观会根据你使用的Windows主题而变化。如果你觉得这个很重要,可以考虑换个工具包;我知道PyQt4可以让你自定义Windows上的滚动条样式。

撰写回答