python - ttk 组合框以编程方式动态设置背景颜色

标签 python tkinter widget

我有一排包含 ttk.Combobox 的小部件,当我勾选该行末尾的复选框时,我想更改该行中小部件的背景颜色。对于 tkinter,只需使用配置就很简单,但是对于 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()

谢谢

最佳答案

首先,如果要将样式应用于单个组合框,请为其指定一个名称,例如“custom.TCombobox”,以便它继承自“TCombobox”,但不会更改默认的组合框样式。然后您所要做的就是将组合框的样式设置为“custom.TCombobox”。

其次,背景没有改变,因为它是您想要更改的字段背景。

编辑:样式中可以自定义的内容取决于所使用的 ttk 主题。例如,默认的 Mac 和 Windows 主题不允许进行太多自定义,并且组合框的字段背景颜色无法更改。但是,“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()

关于python - ttk 组合框以编程方式动态设置背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50834356/

相关文章:

python - 为什么我的 ipywidget observe 在一次状态更改时被多次调用?

python - 使用discord.py显示来自json的数据

python - 使用 tkinter 的条目选择列表

python - GUI设计问题

python - 如何使用 Tkinter 设置网格的位置?

javascript - 在 jQuery UI MultiSelect Widget 中选择复选框

api - 新 Instagram API 的小图像尺寸 graph.instagram.com/me/media

python - 从嵌套列表的字典理解返回字典

python - selenium.common.exceptions.WebDriverException : Message: Can not connect to the Service error using ChromeDriver Chrome through Selenium Python

python - 如何使标签中的文本达到一定长度后转到下一行