Python 如何动态更改ttk.Combobox下拉列表颜色

Python 如何动态更改ttk.Combobox下拉列表颜色,python,tkinter,ttk,Python,Tkinter,Ttk,显然,ttk.Combobox下拉列表框不是ttk小部件,而是Tkinter列表框,默认采用系统颜色 该示例在应用程序加载时,使用option_add方法以硬编码的方式更改ttk.Combobox下拉列表框的背景色和前景色。colorize函数不起作用,因此在加载应用程序后,我似乎需要另一种方法来再次更改颜色,显然选项_add()只使用一次。有没有办法动态更改下拉列表的颜色?我正在使用Windows计算机和Python 3.8 我查看了这些文档,但没有找到答案: 将tkinter作为tk导

显然,ttk.Combobox下拉列表框不是ttk小部件,而是Tkinter列表框,默认采用系统颜色

该示例在应用程序加载时,使用option_add方法以硬编码的方式更改ttk.Combobox下拉列表框的背景色和前景色。colorize函数不起作用,因此在加载应用程序后,我似乎需要另一种方法来再次更改颜色,显然选项_add()只使用一次。有没有办法动态更改下拉列表的颜色?我正在使用Windows计算机和Python 3.8

我查看了这些文档,但没有找到答案:

将tkinter作为tk导入
从tkinter导入ttk
hbg=‘黄色’
前景=‘洋红’
def着色(evt):
打印(evt.widget.get())
bg=evt.widget.get()
root.option\u add(“*TCombobox*Listbox*Background”,背景)
root=tk.tk()
root.option\u add(“*TCombobox*Listbox*Background”,hbg)
root.option\u add(“*TCombobox*列表框*前景”,前景)
c=ttk.Combobox(根,值=('red','white','blue'))
c、 网格()
c、 绑定(“”,着色)
root.mainloop()

组合框的列表框不能通过Python直接访问。但是,这可以使用底层Tcl解释器完成:

root.tk.eval('[ttk::combobox::PopdownWindow {}].f.l configure -background {}'.format(c, bg))
为了更方便,您可以使用自定义的
MyCombobox
,它有一个
config\u poppdown()
方法来轻松更改列表框的背景和前景:

import tkinter as tk
from tkinter import ttk

hbg = 'yellow'
fg = 'magenta'

class MyCombobox(ttk.Combobox):
    def config_popdown(self, **kwargs):
        self.tk.eval('[ttk::combobox::PopdownWindow {}].f.l configure {}'.format(self, ' '.join(self._options(kwargs))))

def colorize(evt):
    print(evt.widget.get())
    bg = evt.widget.get()
    evt.widget.config_popdown(background=bg)

root = tk.Tk()
root.option_add("*TCombobox*Listbox*Background", hbg)
root.option_add("*TCombobox*Listbox*Foreground", fg)

c = MyCombobox(root, values=('red', 'white', 'blue'))
c.grid()
c.bind('<<ComboboxSelected>>', colorize)

root.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
hbg=‘黄色’
前景=‘洋红’
类MyCombobox(ttk.Combobox):
def config_弹出窗口(自身,**kwargs):
self.tk.eval('[ttk::combobox::PopdownWindow{}].f.l配置{}.format(self),.join(self.\u选项(kwargs)))
def着色(evt):
打印(evt.widget.get())
bg=evt.widget.get()
evt.widget.config_弹出窗口(后台=bg)
root=tk.tk()
root.option\u add(“*TCombobox*Listbox*Background”,hbg)
root.option\u add(“*TCombobox*列表框*前景”,前景)
c=MyCombobox(根,值=('red','white','blue'))
c、 网格()
c、 绑定(“”,着色)
root.mainloop()

这是Python的
eval
方法吗?它看起来像是导入的tkinter方法?@Luther这不是python
eval()
方法,而是来自
tkinter
的方法,它允许访问运行Tk GUI的tcl解释器。
import tkinter as tk
from tkinter import ttk

hbg = 'yellow'
fg = 'magenta'

class MyCombobox(ttk.Combobox):
    def config_popdown(self, **kwargs):
        self.tk.eval('[ttk::combobox::PopdownWindow {}].f.l configure {}'.format(self, ' '.join(self._options(kwargs))))

def colorize(evt):
    print(evt.widget.get())
    bg = evt.widget.get()
    evt.widget.config_popdown(background=bg)

root = tk.Tk()
root.option_add("*TCombobox*Listbox*Background", hbg)
root.option_add("*TCombobox*Listbox*Foreground", fg)

c = MyCombobox(root, values=('red', 'white', 'blue'))
c.grid()
c.bind('<<ComboboxSelected>>', colorize)

root.mainloop()