如何修改Tkinter Scale的ttk Style布局中已创建的滑块图片元素
解决方案
你之前的写法不生效有两个核心原因:
element_create创建的元素属性绑定在元素本身,无法通过修改父样式的configure参数直接修改元素的图片属性- ttk样式的
configure方法不支持直接指定子元素路径修改属性,你使用的custom.Horizontal.TScale.custom.Scale.slider这种样式路径语法无效
实现步骤
1. 预定义不同图片对应的滑块元素
首先将公共轨道元素和三个不同图片的滑块元素提前创建:
style = ttk.Style() # 创建共用的轨道元素 style.element_create('custom.Scale.trough', 'image', self.trough) # 分别为三张滑块图片创建对应元素 for idx, img in enumerate(self.slider): style.element_create(f'custom.Scale.slider{idx}', 'image', img)
2. 改造CustomScale类,支持滑块设置与动态切换
class CustomScale(ttk.Scale): def __init__(self, master=None, slider_idx=0, **kw): kw.setdefault("orient", "horizontal") self.variable = kw.pop('variable', DoubleVar(master)) ttk.Scale.__init__(self, master, variable=self.variable, **kw) self.orient = kw['orient'].capitalize() self._style_name = '{}.custom.{}.TScale'.format(self, self.orient) self['style'] = self._style_name # 初始化设置对应滑块 self.set_slider(slider_idx) def set_slider(self, slider_idx): style = ttk.Style() # 重写当前实例专属样式的布局,替换为对应索引的滑块元素 style.layout(self._style_name, [('custom.Scale.trough', {'sticky': 'we'}), (f'custom.Scale.slider{slider_idx}', {'side': 'left', 'sticky': '', 'children': [('custom.Horizontal.Scale.label', {'sticky': ''})] })]) style.configure(self._style_name, background='#ffffff')
3. 使用方法
- 初始化不同滑块的Scale实例:
# 创建滑块为第一张图的Scale scale1 = CustomScale(master, slider_idx=0) # 创建滑块为第二张图的Scale scale2 = CustomScale(master, slider_idx=1) - 动态切换单个Scale的滑块:
# 将scale1的滑块切换为第三张图 scale1.set_slider(2)
所有修改只会作用于调用方法的单个Scale实例,不会影响其他控件。
内容的提问来源于stack exchange,提问作者Soda
相关产品推荐
相关产品推荐

