Tkinter非激活状态下Scrollbar样式设置问题求助
如何让ttk.Scrollbar仅在激活状态应用自定义样式,非激活时恢复默认?
我配置了ttk.Scrollbar的自定义样式,但希望这个样式只在滚动条激活状态(即内容长度足够支持滚动)时生效,当滚动条处于非激活状态时恢复为默认样式。目前我不清楚该如何修改非激活状态的样式,同时也想了解如何查找ttk样式的所有配置关键词。
相关代码如下:
savearea_canvas = tk.Canvas(savearea, borderwidth=0, highlightthickness=0,bg=DLGcolor) style = ttk.Style() style.theme_use('default') style.configure("TScrollbar", gripcount=0, background=FOCUScolor, darkcolor=BGcolor, lightcolor=DLGcolor, troughcolor=DLGcolor, ) savearea_scrollbar = ttk.Scrollbar(savearea, orient='vertical', command=savearea_canvas.yview,style="TScrollbar") savearea_canvas.configure(yscrollcommand=savearea_scrollbar.set) savearea_scroll = tk.Frame(savearea_canvas,bg=DLGcolor) savearea_scroll.bind('<Configure>',lambda e: savearea_canvas.configure(scrollregion=savearea_canvas.bbox('all'))) savearea_canvas.create_window((0, 0), window=savearea_scroll, anchor='nw') savearea_canvas.configure(yscrollcommand=savearea_scrollbar.set) savearea_canvas.pack(side='left', fill='both', expand=True) savearea_scrollbar.pack(side='right', fill='y')
- 非激活状态滚动条:显示为较浅的、不可交互的默认样式
- 激活状态滚动条:显示自定义的深色背景样式
解决方法
1. 动态适配滚动条状态样式
ttk滚动条的非激活状态对应disabled,激活状态对应normal。你可以通过监听Canvas内容区域变化,判断是否需要滚动,再切换对应样式:
方法一:用style.map()配置状态关联样式
通过style.map()为TScrollbar的不同状态绑定不同属性,滚动条状态变化时会自动切换样式:
style = ttk.Style() style.theme_use('default') # 配置激活状态的自定义样式 style.configure("TScrollbar", gripcount=0, background=FOCUScolor, darkcolor=BGcolor, lightcolor=DLGcolor, troughcolor=DLGcolor, ) # 配置非激活状态样式,恢复为主题默认值 style.map("TScrollbar", background=[('disabled', style.lookup('TScrollbar', 'background', state='normal'))], darkcolor=[('disabled', style.lookup('TScrollbar', 'darkcolor', state='normal'))], lightcolor=[('disabled', style.lookup('TScrollbar', 'lightcolor', state='normal'))], troughcolor=[('disabled', style.lookup('TScrollbar', 'troughcolor', state='normal'))] )
方法二:定义双样式,动态切换
创建两个独立样式,一个是自定义激活样式,一个是默认样式,在Canvas内容变化时判断切换:
style = ttk.Style() style.theme_use('default') # 自定义激活样式 style.configure("Active.TScrollbar", gripcount=0, background=FOCUScolor, darkcolor=BGcolor, lightcolor=DLGcolor, troughcolor=DLGcolor, ) # 默认样式(继承主题默认) style.configure("Default.TScrollbar") # 更新滚动条状态的函数 def update_scrollbar_state(e): savearea_canvas.configure(scrollregion=savearea_canvas.bbox('all')) # 判断内容是否超出可视范围 canvas_height = savearea_canvas.winfo_height() scroll_region_height = savearea_canvas.bbox('all')[3] if scroll_region_height > canvas_height: savearea_scrollbar.config(style="Active.TScrollbar", state='normal') else: savearea_scrollbar.config(style="Default.TScrollbar", state='disabled') # 替换原有绑定 savearea_scroll.bind('<Configure>', update_scrollbar_state)
2. 查找ttk样式配置关键词的方法
- 查看元素可配置选项:用
style.element_options()查看滚动条各组成元素的可配置参数:print(style.element_options('Vertical.Scrollbar.trough')) # 查看轨道元素选项 print(style.element_options('Vertical.Scrollbar.slider')) # 查看滑块元素选项 - 查看样式布局结构:用
style.layout()了解滚动条的组成元素:print(style.layout('TScrollbar')) - 获取当前样式属性值:用
style.lookup()查询指定属性的当前配置:print(style.lookup('TScrollbar', 'background')) - 官方文档参考:查阅Python官方的Tkinter ttk Style文档,里面列出了所有支持的样式配置属性。
内容的提问来源于stack exchange,提问作者Sakura Luna
相关产品推荐
相关产品推荐

