我在使用tkinter ttk和' vista'设置Combobox的背景颜色时遇到问题。主题(我使用Python 3)。我从这里尝试过代码ttk.Combobox glitch when state is read-only and out of focus
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忽略了这个参数。你知道怎么解决吗?也许有一种方法只能在特定主题中配置特定样式?我看到了默认'主题,如果状态为“只读”,则背景会变为灰色。
答案 0 :(得分:3)
显然,您设置新样式属性的顺序对于确定是否应用新样式的某个属性非常重要。例如,如果我先设置background
而不是selectbackground
,则不会更改选择的颜色,而只会更改带箭头的迷你按钮颜色(列出选项)。
我还注意到,根据parent
的值,我认为是父样式,从中派生出新的样式,其中一些可能不会应用新样式的新设置和属性。例如,如果我在fieldbackground
设置为parent
时尝试更改aqua
属性,则它不起作用,但如果parent
设置为alt
, 有用。 (我希望更多专家用户可以提供帮助,并为改进此答案做出贡献,这对ttk
和tkinter
的未来用户也有帮助。
这是我的解决方案,我在其中创建了一个全新的风格:
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
类型的某个实例,但我应用了< em> theme 到未来可能ttk.Combobox
的所有实例。如果有人能改进这个答案,我真的很感激这个姿态!
答案 1 :(得分:3)
以下代码对我来说很好。重要的是设置参数的顺序。
`
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())
`
答案 2 :(得分:0)
如果您只想更改颜色而不考虑小部件的状态(即悬停、按下等...),那么您将需要使用 configure
方法而不是 {{ 1}} 方法,因为 map
方法专门用于将各种格式应用于特定的小部件状态。由于您只使用“只读”状态,我认为这就是您想要的。
map