如何设置ttk.Combobox的背景颜色

9

我使用Python 3,使用tkinter ttk库的"vista"主题时,为组合框设置背景颜色遇到了问题。 我尝试了来自这里的代码。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
combo = ttk.Combobox(root, values=['1', '2', '3'])
combo['state'] = 'readonly'
combo.pack()
tk.Entry(root).pack()

style = ttk.Style()
style.map('TCombobox', selectbackground=[('readonly', 'red')])
#style.map('TCombobox', fieldbackground=[('readonly', 'blue')]) #not working as well

但这只会更改文本的背景,组合框的其余部分仍然是白色。我在tcl论坛上看到了一篇帖子:http://wiki.tcl.tk/15780,我尝试使用“fieldbackground”,但似乎tkinter忽略了此参数。您有任何解决方法吗?也许有一种方法可以在特定主题中仅配置特定样式?我看到对于“default”主题,如果状态为“readonly”,则背景颜色会更改为灰色。

你的代码在Python 2.7中运行良好。你只需要使用fieldbackground即可,它会按预期工作。 - manty
你试过用“Vista”主题吗?对于这个主题,它对我不起作用。 - voldi
3个回答

8
显然,您设置新 style 属性的顺序很重要,以确定是否应用新样式的某些属性。例如,如果我先设置background而不是selectbackground,那么选择的颜色将不会改变,但只是带箭头的迷你按钮的颜色(向下列出选项)。
我还注意到,根据parent的值,新样式的一些新设置和属性可能不会被应用。我猜测parent是从中派生新 style 的父样式。例如,如果我尝试在parent设置为aqua时更改fieldbackground属性,它将无法工作,但如果parent设置为alt,它将工作。(我希望更有经验的用户可以帮助并贡献力量,这对于未来的ttktkinter用户也可能有所帮助)。
这是我的解决方案,我创建了一个完整的新样式:
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

combostyle = ttk.Style()

combostyle.theme_create('combostyle', parent='alt',
                         settings = {'TCombobox':
                                     {'configure':
                                      {'selectbackground': 'blue',
                                       'fieldbackground': 'red',
                                       'background': 'green'
                                       }}}
                         )
# ATTENTION: this applies the new style 'combostyle' to all ttk.Combobox
combostyle.theme_use('combostyle') 

# show the current styles
# print(combostyle.theme_names())

combo = ttk.Combobox(root, values=['1', '2', '3'])
combo['state'] = 'readonly'
combo.pack()

entry = tk.Entry(root)
entry.pack()

root.mainloop()

由于我不是ttk专家,所以无法仅将新的主题应用于特定类型ttk.Combobox的实例,但我将主题应用于所有可能的未来ttk.Combobox实例。如果有人能改进这个答案,我会非常感激!

有关如何创建和设置新样式的更多信息,请参见此处此处


嗨,我已经尝试了你的代码,它似乎可以工作。不幸的是,看起来没有可能改变背景颜色,比如说,“vista”主题。对于“winnative”,您只能更改背景颜色, 对于“clam”,“alt”,“default”,“classic”,您可以更改所有内容,并且在组合框聚焦或选定时具有一些不同的行为。 对于“vista”和“xpnative”,似乎根本不起作用。 - voldi

7

以下代码对我很有效。设置参数的顺序非常重要。

style = ttk.Style()

style.map('TCombobox', fieldbackground=[('readonly','white')])
style.map('TCombobox', selectbackground=[('readonly', 'white')])
style.map('TCombobox', selectforeground=[('readonly', 'black')])

self.mycombo = ttk.Combobox(self.frame,textvariable=self.combo_var,
                            height=15,justify='left',width=21,
                            values=lista)

self.mycombo['state'] = 'readonly' # Set the state according to configure colors
self.mycombo.bind('<<ComboboxSelected>>',
                  lambda event: self._click_combo())

0

如果您只想更改颜色而不考虑小部件的状态(即悬停,按下等),那么您将需要使用configure方法而不是map方法,因为map方法专门用于将各种格式应用于特定的小部件状态。由于您仅使用“readonly”状态,我认为这就是您想要的。

style.configure('TCombobox', fieldbackground='red')

1
请在您的答案中添加更多细节以解释。 - Sathiamoorthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接