问题描述
显然,ttk.ComboBox下拉列表框不是ttk小部件,而是Tkinter列表框,默认情况下采用系统颜色。
该示例在应用程序加载时使用option_add方法以硬编码方式更改了ttk.ComboBox下拉列表框的背景和前景色。 colorize函数不起作用,因此看起来好像我需要一种不同的方法来在应用程序加载后再次更改颜色,显然option_add()仅使用一次。有没有办法动态更改下拉颜色?我正在使用Windows计算机和Python 3.8。
我查看了这些文档,但没有找到答案:
https://wiki.tcl-lang.org/page/Changing+Widget+Colors
https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_combobox.htm
How to change background color in ttk.Combobox's listview?
import tkinter as tk
from tkinter import ttk
hbg = 'yellow'
fg = 'magenta'
def colorize(evt):
print(evt.widget.get())
bg = evt.widget.get()
root.option_add("*TComboBox*ListBox*Background",bg)
root = tk.Tk()
root.option_add("*TComboBox*ListBox*Background",hbg)
root.option_add("*TComboBox*ListBox*Foreground",fg)
c = ttk.ComboBox(root,values=('red','white','blue'))
c.grid()
c.bind('<<ComboBoxSelected>>',colorize)
root.mainloop()
解决方法
不能通过Python直接访问组合框的列表框。但是,可以使用基础的Tcl解释器完成此操作:
root.tk.eval('[ttk::combobox::PopdownWindow {}].f.l configure -background {}'.format(c,bg))
为了更加方便,您可以使用具有MyCombobox
方法的自定义config_popdown()
来轻松更改列表框的背景和前景:
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()