微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何动态更改ttk.Combobox下拉颜色

显然,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。