user3514446
user3514446

Reputation: 77

Change text colour in Tkinter combobox, based on origin

I have two lots of computer names found in AD, all of which are sorted together and entered into a tkinter drop-down combobox. I would like to be able to change the text colour of the entries in the drop-down depending on which original list of computers it came from.

OPSpclist = []
OPS_pcs = active_directory.AD_object ("LDAP://OU=Locations - ...")
for OPSpc in OPS_pcs.search (objectCategory='Computer'):
    OPSpc = str(OPSpc).upper()
    OPSpc = OPSpc.split(",")[0].split("=")[1]
    OPSpclist.append(OPSpc)

OSpclist = []
OS_pcs = active_directory.AD_object ("LDAP://OU=Locations - ...")
for OSpc in OS_pcs.search (objectCategory='Computer'):
    OSpc = str(OSpc).upper()
    OSpc = OSpc.split(",")[0].split("=")[1]
    OSpclist.append(OSpc)

bothSchools = sorted(OSpclist) + sorted(OPSpclist)
optionList = sorted(bothSchools)

var1 = StringVar()
var1.set(optionList[0])
pcnameEntry = ttk.Combobox(entryframe, textvariable = var1, values = optionList, width=25)
pcnameEntry.focus_set()
pcnameEntry.grid(row=1, column=0, sticky=W, pady=(0, 10), padx=5)

Is it possible to have the items from the first list to appear in a different colour, all within the same, sorted, combobox drop-down list?

Thanks, Chris.

Upvotes: 0

Views: 541

Answers (1)

j_4321
j_4321

Reputation: 16169

Yes this is possible, the drop down is a listbox and therefore the items can be configured separately with the itemconfigure method. However, I don't know how to retrieve the combobox's listbox via Python but this can be done through tcl commands:

import Tkinter as tk
import ttk

root = tk.Tk()

l1 = [(name, 'computer 1') for name in 'ABCD']
l2 = [(name, 'computer 2') for name in 'ACEG']

l = sorted(l1 + l2)

combo = ttk.Combobox(root, values=[name for name, computer in l])
combo.pack()
combo.update_idletasks()
# I need to display the drop down once before setting the items' colors otherwise
# I get an error telling me the items don't exist, so I generate a click on the combobox button
combo.event_generate('<1>', x=combo.winfo_width() - 4, y=1)

colors = {'computer 1': 'blue', 'computer 2': 'red'}

# define the tcl variable corresponding to the drop down listbox
combo.tk.eval('set popdown [ttk::combobox::PopdownWindow %s]' % combo)

for i, (name, computer) in enumerate(l):
    # set the color of each item (the background color can be changed too by adding '-background <color>')
    combo.tk.eval('$popdown.f.l itemconfigure %i -foreground %s' % (i, colors[computer]))
root.mainloop()

Upvotes: 2

Related Questions