如何使用ttk.Style修改Combobox下拉选项窗口的颜色?
ttk Combobox选中项与下拉列表颜色修改方法
ttk框架下TCombobox样式规则默认仅覆盖选择输入框本体部分,下拉弹出的选项列表是独立的原生Tk Listbox组件,不受ttk主题配置直接管控,因此无法在TCombobox的configure参数中找到下拉列表对应的配置项。选中项颜色、下拉列表背景色均支持自定义,实现方式如下:
配置规则说明
- 输入框本体的选中项颜色:直接补全
TCombobox配置中留空的selectbackground参数即可,selectforeground为选中项文字颜色 - 下拉选项列表颜色:需要通过Tcl底层接口获取下拉列表对应的Listbox对象,单独配置其背景、文字、选中态颜色
完整实现代码
import tkinter as tk from tkinter import ttk frame = tk.Tk() frame.geometry("400x300") # 配置Combobox本体主题样式 combostyle = ttk.Style() combostyle.theme_create('combostyle', parent='alt', settings={ 'TCombobox': { 'configure': { 'fieldbackground': '#313131', 'foreground':'#FFFFFF', 'selectbackground':'#555555', # 输入框内选中项背景色 'selectforeground':'#FFFFFF', # 输入框内选中项文字色 'bordercolor':'white', 'background': '#313131' } } } ) combostyle.theme_use('combostyle') modechoices=ttk.Combobox(frame,values=["A","B","C"], width=50, state="readonly") modechoices.place(x=20, y=250) # 配置下拉列表样式 def config_dropdown_style(event=None): # 获取下拉弹出窗口路径 popdown = modechoices.tk.call("ttk::combobox::PopdownWindow", modechoices) # 获取弹出窗口内的列表框组件路径 dropdown_lb = f"{popdown}.f.l" # 配置列表框颜色 modechoices.tk.call(dropdown_lb, "configure", "-bg", "#313131", # 下拉列表背景色 "-fg", "#FFFFFF", # 下拉列表默认文字色 "-selectbackground", "#555555", # 下拉列表选中项背景色 "-selectforeground", "#FFFFFF" # 下拉列表选中项文字色 ) # 绑定首次点击事件触发配置,避免组件未初始化时找不到弹出层 modechoices.bind("<ButtonPress-1>", config_dropdown_style, add="+") frame.mainloop()
注意事项
- 不要给ttk.Combobox组件直接传入
background、foreground这类原生Tk组件参数,ttk组件不识别这类参数,所有本体样式需通过ttk.Style统一配置,避免样式冲突 - 下拉列表配置不要在Combobox初始化后立即执行,此时弹出层尚未创建,会触发找不到组件的报错,绑定点击事件触发是兼容性最好的方式
内容的提问来源于stack exchange,提问作者Akascape
相关产品推荐
相关产品推荐

