Comment changer dynamiquement les couleurs de la liste déroulante ttk.Combobox


Luther

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()
j_4321

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 MyComboboxqui 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()

Articles connexes


Comment modifier dynamiquement les valeurs de la liste déroulante

utilisateur8295448 HI J'utilise le plugin davidstutz bootstrap-multiselect, je souhaite mettre à jour les valeurs de la liste déroulante du département en fonction de la valeur de la liste déroulante du client voici le code pour Client Dropdown (format C# ASP.

Comment échanger les valeurs de la liste déroulante ?

anube J'ai deux listes déroulantes (c'est-à-dire une liste déroulante avec des valeurs minimales et une autre avec des valeurs maximales). Si je sélectionne une valeur dans la première liste déroulante avec une valeur supérieure à celle de la deuxième liste dé

Comment changer l'arrière-plan de la liste déroulante ComboBox?

Mapplesoft J'ai un ComboBoxprojet UWP que je souhaite modifier. Je veux changer la couleur d'arrière-plan du StackPanel(?) Contenant le ComboBoxItems, mais je n'ai pas trouvé de moyen simple de le faire. Ici, je veux changer la couleur du rembourrage gris clai

Masquer et afficher la liste déroulante ttk.Combobox

Ours du soleil Situation: Lorsque j'utilise le bouton de la souris pour cliquer sur la "flèche vers le bas" d'un, ttk.Comboboxson comportement standard est d'afficher une liste déroulante. Lorsque la flèche vers le bas est cliquée la deuxième fois, la liste dé

Comment changer la largeur de la liste déroulante Kivy

courbe d'apprentissage J'ai un menu déroulant kivy et je ne parviens pas à modifier la largeur du bouton. Est-ce que quelqu'un sait comment faire ça? J'ai joint une photo de ce à quoi ressemble le bouton. Voici la ligne où j'ajoute des boutons: self.drop_down.