在tkinter选项菜单中为不同选择设置不同颜色

0 投票
3 回答
5368 浏览
提问于 2025-04-16 23:14

我正在使用Python和Tkinter。我有一个选项菜单,里面有三个选择,其中一个是“开启”。我想在选择“开启”时,让它的背景变成绿色。我不是说字体颜色,而是当我选择“开启”时,整个选项菜单的背景要变成绿色,而其他选项的背景保持默认的灰色。

我该怎么做呢?我看到其他帖子只是把整个选项菜单的背景颜色改成了不同的颜色,但我只想在选择特定选项时才改变颜色。谢谢!

3 个回答

0

你可以在它上面加一个追踪:

from Tkinter import *

OPTIONS = (
    "egg",
    "go",
    "spam"
)

root = Tk()

var = StringVar()
var.set(OPTIONS[0]) # default

def callbackFunc(name, index, mode):
    value = var.get()
    if value == 'go':
        om.config(bg='green',fg='black',
                 activebackground='green',
                 activeforeground='black')
    else:
        om.config(bg='SystemButtonFace',fg='SystemButtonText',
                 activebackground='SystemButtonFace',
                 activeforeground='SystemButtonText')

om = OptionMenu(root, var, *OPTIONS)
om.pack()

Callbackname = var.trace_variable('w', callbackFunc)

root.mainloop()
0

如果你在使用Windows系统,那就没什么办法了,因为菜单是系统自带的控件,不能进行太多的自定义。对于OSX系统,情况可能也差不多,但我记不太清楚了。

在其他平台上,你可以使用与选项菜单相关的菜单的entryconfigure方法,这个方法可以让你设置菜单中每个选项的背景颜色。

1

把这个归类为U,代表丑陋:

from Tkinter import *

OPTIONS = (
    "egg",
    "go",
    "spam"
)

controlsMap = {}

root = Tk()

def callbackFunc(name, index, mode):
    value = root.getvar(name) #getvar: return the value of Tcl variable NAME
    widget = controlsMap[name]
    if value == 'go':
        widget.config(bg='green',fg='black',
                 activebackground='green',
                 activeforeground='black')
    else:
        widget.config(bg='SystemButtonFace',fg='SystemButtonText',
                 activebackground='SystemButtonFace',
                 activeforeground='SystemButtonText')


var1 = StringVar(root, name='var1') #give it a master and a name
var1.set(OPTIONS[0])
om1 = OptionMenu(root, var1, *OPTIONS)
om1.config(width=5)
om1.grid(row=0, column=0)
controlsMap['var1'] = om1
var1.trace_variable('w', callbackFunc)

var2 = StringVar(root, name='var2') #
var2.set(OPTIONS[0])
om2 = OptionMenu(root, var2, *OPTIONS)
om2.config(width=5)
om2.grid(row=0, column=1)
controlsMap['var2'] = om2
var2.trace_variable('w', callbackFunc)

var3 = StringVar(root, name='var3') #
var3.set(OPTIONS[0])
om3 = OptionMenu(root, var3, *OPTIONS)
om3.config(width=5)
om3.grid(row=0, column=2)
controlsMap['var3'] = om3
var3.trace_variable('w', callbackFunc)


root.mainloop()

撰写回答