ttk Combobox以编程方式动态设置背景颜色

时间:2018-06-13 09:58:10

标签: python tkinter widget

我有一行小部件,其中包含一个ttk.Combobox,当我勾选行末的Checkbutton时,我想更改行中小部件的背景颜色。使用tkinter只需使用configure即可,但是如果使用ttk,则必须使用一个似乎既不动态也不特定于单个小部件的主题。有没有办法实现这个功能?

三江源。

回应fhdrsdg的评论。我无法使用它,但此代码演示了它

import Tkinter as tk
import ttk


def skillUsed():
    if chkUsedVar.get() == 1:
        style.map('TCombobox', background=[('readonly','green')])
        style.map('TCombobox', foreground=[('readonly','red')])
    else:
        style.map('TCombobox', background=[('readonly','white')])
        style.map('TCombobox', foreground=[('readonly','black')])

root = tk.Tk()

style = ttk.Style()

cboxVar1 = tk.StringVar()
cboxVar1.set("spam")

cboxVar2 = tk.StringVar()
cboxVar2.set("silly")

chkUsedVar = tk.IntVar()
chk = tk.Checkbutton(root, text='Used', variable=chkUsedVar, command=skillUsed)
chk.grid(row=0, column=2)

combo01 = ttk.Combobox(root, values=['spam', 'eric', 'moose'], textvariable=cboxVar1)
combo01['state'] = 'readonly'
combo01.grid(row=0, column=0)

combo02 = ttk.Combobox(root, values=['parrot', 'silly', 'walk'], textvariable=cboxVar2)
combo02['state'] = 'readonly'
combo02.grid(row=0, column=1)

root.mainloop()

单击勾选框时,前景变为红色,未勾选时变为黑色。问题是背景永远不会改变(但没有错误),并且样式全局应用于两个组合框,我想将它应用于单个框。

我有一个解决方法,我将使用tkinter的OptionMenu,我在tinterweb上可以找到的一切意味着它不能用ttk小部件完成,但这似乎对ttk小部件有点限制但我对tkinter或ttk几乎没有经验。

解决方法是: -

from Tkinter import *

def skillUsed():
    if chkUsedVar.get() == 1:
        opt01.configure(bg="#000fff000")
        opt01.configure(highlightbackground="#000fff000")
        opt01.configure(activebackground="#000fff000")
        opt01.configure(highlightcolor="#000fff000")
        opt01["menu"].configure(bg="#000fff000")
    else:
        opt01.configure(bg=orgOptbg)
        opt01.configure(highlightbackground=orgOpthighlightbackground)
        opt01.configure(activebackground=orgOptactivebackground)
        opt01.configure(highlightcolor=orgOpthighlightcolor)
        opt01["menu"].configure(bg=orgOptmenu)

root = Tk()
optionList = ('parrot','silly','walk')
varopt01 = StringVar()
varopt01.set(optionList[0])
chkUsedVar = IntVar()

opt01 = OptionMenu(root, varopt01, *optionList)
opt01.grid(row=0, column=0)

orgOptbg = opt01.cget("bg")
orgOpthighlightbackground = opt01.cget("highlightbackground") 
orgOptactivebackground = opt01.cget("activebackground")
orgOpthighlightcolor = opt01.cget("highlightcolor")
orgOptmenu = opt01["menu"].cget("bg")

chk = Checkbutton(root, text='Used', variable=chkUsedVar, command=skillUsed)
chk.grid(row=0, column=1)
root.mainloop()

三江源

1 个答案:

答案 0 :(得分:0)

首先,如果您想将样式应用于单个组合框,请为其命名,例如“custom.TCombobox”'所以它继承了“TCombobox”#9;但不会更改默认的组合框样式。然后,你所要做的就是将你的组合框的样式设置为“custom.TCombobox”。

其次,背景并没有改变,因为它是你想要改变的场地背景。

编辑:可以在样式中自定义的内容取决于所使用的ttk主题。例如,默认的Mac和Windows主题不允许进行太多自定义,并且组合框的fieldbackground颜色无法更改。然而,' alt'和' clam'主题允许更多自定义。

以下是基于您的代码的示例:

import tkinter as tk
from tkinter import ttk


def skillUsed():
    if chkUsedVar.get() == 1:
        style.map('custom.TCombobox', fieldbackground=[('readonly','green')])
        style.map('custom.TCombobox', foreground=[('readonly','red')])
    else:
        style.map('custom.TCombobox', fieldbackground=[('readonly','white')])
        style.map('custom.TCombobox', foreground=[('readonly','black')])

root = tk.Tk()

style = ttk.Style()
style.theme_use('alt')

cboxVar1 = tk.StringVar()
cboxVar1.set("spam")

cboxVar2 = tk.StringVar()
cboxVar2.set("silly")

chkUsedVar = tk.IntVar()
chk = tk.Checkbutton(root, text='Used', variable=chkUsedVar, command=skillUsed)
chk.grid(row=0, column=2)

combo01 = ttk.Combobox(root, values=['spam', 'eric', 'moose'], textvariable=cboxVar1)
combo01['state'] = 'readonly'
combo01.grid(row=0, column=0)

combo02 = ttk.Combobox(root, values=['parrot', 'silly', 'walk'], textvariable=cboxVar2, style='custom.TCombobox')
combo02['state'] = 'readonly'
combo02.grid(row=0, column=1)

root.mainloop()