ttk Combobox устанавливает цвет фона программно и динамически - PullRequest
0 голосов
/ 13 июня 2018

У меня есть строка виджетов, которая содержит 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()

Когда нажата галочка, передний план становится красным, а когда не отмечен, он становится черным.Проблема в том, что фон никогда не меняется (но не ошибается), и стиль применяется глобально к обоим комбинированным спискам, и я хочу применить его к одному блоку.

У меня есть обходной путь, который я буду использовать, просто используяOptionMenu от tkinter и все, что я могу найти в 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 голосов
/ 13 июня 2018

Во-первых, если вы хотите применить стиль к отдельному комбинированному списку, присвойте ему имя, например «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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...