Разный цвет для разных вариантов в меню параметров tkinter

Я использую Python и Tkinter. У меня есть меню опций с тремя вариантами, одним из которых является «включено». Я хочу, чтобы «включено» было зеленым, когда я его выбираю. Я не имею в виду шрифт. Я хочу, чтобы фон меню параметров был зеленым, когда я выбираю «вкл», а другие параметры будут просто серыми по умолчанию.

Как я могу это сделать? Я видел другие сообщения, которые просто делают фон всего меню опций другим цветом, но мне нужен цвет только при выборе определенного варианта. Благодарю вас!


person Jack    schedule 09.08.2011    source источник
comment
Я видел другие сообщения, которые просто делают фон всего меню опций другим цветом, но мне нужен цвет только при выборе определенного варианта. Затем просто нажмите на элемент в меню, чтобы вызвать метод, который также меняет цвет фона, а два других элемента меняют цвет обратно.   -  person JAB    schedule 10.08.2011


Ответы (3)


файл это под 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()
person noob oddy    schedule 16.08.2011

вы можете поставить на нем след:

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()
person noob oddy    schedule 13.08.2011
comment
Это именно то, что мне было нужно! Спасибо! - person Jack; 15.08.2011
comment
Если у меня есть несколько меню параметров с одинаковыми значениями, есть ли способ, чтобы все они использовали одну и ту же функцию обратного вызова? Я заметил, что в callbackFunc вы специально получаете переменную. Есть ли способ сделать так, чтобы вы могли отправлять аргументы обратному вызову при выполнении trace_variable? - person Jack; 15.08.2011

Если вы работаете в Windows, вам не повезло, потому что меню — это родные элементы управления, которые не позволяют так много настроек. То же самое может быть и для osx, но я точно не помню.

Для других платформ вы можете использовать метод entryconfigure меню, связанного с меню параметров, которое позволяет вам установить цвет фона для каждой записи в меню.

person Bryan Oakley    schedule 09.08.2011