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

2024-09-27 19:18:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一行包含ttk.组合框当我勾选行末的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的选项菜单,我能在tinterweb上找到的所有东西都意味着它不能用ttk小部件完成,但这似乎对ttk小部件有点限制,但我对tkinter或ttk几乎没有经验。在

解决方法是:

^{pr2}$

谢谢


Tags: mapstyle部件tkintercolumnroottkgrid
1条回答
网友
1楼 · 发布于 2024-09-27 19:18:36

首先,如果要将样式应用于单个组合框,请将其命名为'自定义.TCombobox,以便它继承“TCombobox”,但不更改默认的组合框样式。然后,您只需将组合框的样式设置为'自定义.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()

相关问题 更多 >

    热门问题