Comment changer dynamiquement les couleurs de la liste déroulante ttk.Combobox
Apparemment, la liste déroulante ttk.Combobox, qui n'est pas un widget ttk mais une liste Tkinter, prend les couleurs du système par défaut.
L'exemple change les couleurs d'arrière-plan et de premier plan de la liste déroulante ttk.Combobox de manière codée en dur lorsque l'application se charge, à l'aide de la méthode option_add. La fonction de colorisation ne fonctionne pas, il semble donc que j'ai besoin d'une méthode différente pour changer à nouveau la couleur une fois l'application chargée, évidemment, option_add () n'est utilisée qu'une seule fois. Existe-t-il un moyen de changer les couleurs de la liste déroulante de manière dynamique? J'utilise un ordinateur Windows et Python 3.8.
J'ai regardé ces documents mais je n'ai pas trouvé la réponse:
https://wiki.tcl-lang.org/page/Changing+Widget+Colors
https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_combobox.htm
Comment changer la couleur de fond dans la liste de ttk.Combobox?
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()
La Listbox de la Combobox n'est pas directement accessible via Python. Cependant, cela peut être fait en utilisant l'interpréteur Tcl sous-jacent:
root.tk.eval('[ttk::combobox::PopdownWindow {}].f.l configure -background {}'.format(c, bg))
Pour être plus pratique, vous pouvez utiliser une personnalisation MyCombobox
qui a une config_popdown()
méthode pour changer facilement l'arrière-plan et le premier plan de la zone de liste:
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()