ScrolledText滚动条颜色(Python Tkinter)

时间:2011-08-06 06:44:14

标签: python colors scrollbar tkinter scrolledwindow

我在Tkinter GUI中使用ScrolledText模块。

我希望更改ScrolledText小部件中包含的滚动条的颜色,
但我遇到了一些困难。

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

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

然而,
滚动条仍然具有标准的灰色。

我知道语法是正确的,因为做其他事情,例如:

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

......完全按照预期工作。

但是,尝试更改“浮雕”,“边框宽度”或“颜色”似乎没有任何效果 为什么会这样? d:


规格:

Python 2.7.1
Tkinter的
Windows 7
空闲

2 个答案:

答案 0 :(得分:3)

Tk Scrollbar小部件(vbar)是Windows中的本机滚动条。它的外观取决于Windows主题。如果重要,请考虑更换工具包;我知道PyQt4会让你在Windows上设置滚动条的样式。

答案 1 :(得分:1)

从我读过的内容来看,在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()