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