微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以自定义样式更改tkk滚动条的宽度?

如何解决如何以自定义样式更改tkk滚动条的宽度?

在为ttk Scrollbar定义自定义样式时,我陷入了如何更改滚动条宽度的问题。我注意到,当我从另一个主题复制元素TScrollbar.grip时,宽度(厚度)会缩小,但是当我寻找元素选项style.element_options('My.Vertical.TScrollbar.grip')时,我会得到""

from tkinter import *
from tkinter import ttk

root = Tk()
style = ttk.Style()

# import elements from the 'clam' engine.
style.element_create("My.Vertical.TScrollbar.trough","from","clam")
style.element_create("My.Vertical.TScrollbar.thumb","clam")
style.element_create("My.Vertical.TScrollbar.grip","clam")

style.layout("My.Vertical.TScrollbar",[('My.Vertical.TScrollbar.trough',{'children':
       [('My.Vertical.TScrollbar.thumb',{'unit': '1','children':
            [('My.Vertical.TScrollbar.grip',{'sticky': ''})],'sticky': 'nswe'})],'sticky': 'ns'})])


style.configure("My.Vertical.TScrollbar",gripcount=0,background="#464647",troughcolor='#252526',borderwidth=2,bordercolor='#252526',lightcolor='#252526',darkcolor='#252526')

container = ttk.Frame(root)
canvas = Canvas(container)
scrollbar = ttk.Scrollbar(container,orient="vertical",command=canvas.yview,style="My.Vertical.TScrollbar")
scrollable_frame = ttk.Frame(canvas)
 
scrollable_frame.bind(
    "<Configure>",lambda e: canvas.configure(
        scrollregion=canvas.bBox("all")
    )
)

canvas.create_window((0,0),window=scrollable_frame,anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)

for i in range(50):
    ttk.Label(scrollable_frame,text="Sample scrolling label").pack()

container.pack()
canvas.pack(side="left",fill="both")
scrollbar.pack(side="right",fill="y")

root.mainloop()

解决方法

在对代码进行了一些外观上的更改以使其更具可读性之后,我可以在配置整体样式时通过指定 style.configure() 选项来更改滚动条的宽度。这是在# <----- ADDED THIS.调用中完成的,并显示在下面带有注释 width

的行中

我有一个想法是根据我在ttk.Scrollbar小部件上找到的一些文档使用此选项的,该文档指出,尽管 它不支持tkinter.Scrollbar选项,例如arrowsize可以,您可以:

使用样式配置此选项。您可能会发现配置width是更好的选择。在某些主题中,增加width可能不会增加箭头的大小。

(我首先尝试指定一个from tkinter import * from tkinter import ttk root = Tk() style = ttk.Style() # import elements from the 'clam' engine. style.element_create("My.Vertical.TScrollbar.trough","from","clam") style.element_create("My.Vertical.TScrollbar.thumb","clam") style.element_create("My.Vertical.TScrollbar.grip","clam") style.layout("My.Vertical.TScrollbar",[('My.Vertical.TScrollbar.trough',{'children': [('My.Vertical.TScrollbar.thumb',{'unit': '1','children': [('My.Vertical.TScrollbar.grip',{'sticky': ''})],'sticky': 'nswe'}) ],'sticky': 'ns'})]) style.configure("My.Vertical.TScrollbar",gripcount=0,background="#b0b0b0",troughcolor='#252526',borderwidth=2,bordercolor='#252526',lightcolor='#252526',darkcolor='#252526',arrowsize=40) # <----- ADDED THIS. container = ttk.Frame(root) canvas = Canvas(container) scrollbar = ttk.Scrollbar(container,orient="vertical",command=canvas.yview,style="My.Vertical.TScrollbar") scrollable_frame = ttk.Frame(canvas) scrollable_frame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) canvas.create_window((0,0),window=scrollable_frame,anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) for i in range(50): ttk.Label(scrollable_frame,text=f"Sample scrolling label {i}").pack() container.pack() canvas.pack(side="left",fill="both") scrollbar.pack(side="right",fill="y") root.mainloop() ,但没有任何影响。)

[{
  "title": "book1",isInEnglish: true
},{
  "title": "book1",isInFrench: true
},{
  "title": "book2",isInItalian: true
},{
  "title": "book3",isInFrench: true
}]

结果如下:

screenshot show wide vertial scrollbar

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。