Изменение цвета текста в выпадающем списке Tkinter на основе источника

#python-2.7 #tkinter

#python-2.7 #tkinter

Вопрос:

У меня есть два набора имен компьютеров, найденных в AD, все из которых отсортированы вместе и введены в выпадающий список tkinter. Я хотел бы иметь возможность изменять цвет текста записей в раскрывающемся списке в зависимости от того, с какого исходного списка компьютеров он был получен.

 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)
  

Возможно ли, чтобы элементы из первого списка отображались другим цветом, все в одном и том же отсортированном выпадающем списке со списком?

Спасибо, Крис.

Комментарии:

1. Конечно, через itemconfigure вы можете раскрасить любой элемент выпадающего списка по своему усмотрению. Однако прямо сейчас у вас нет информации, из какого списка происходит каждый элемент, чтобы правильно их раскрасить.

2. Спасибо @CommonSense, это полезно знать. Как мне это сделать? Из строк pcnameEntry? Могу ли я сделать ‘if PCName в OPSpclist’, а затем использовать itemconfigure для изменения цвета, или это будет более сложным, чем сделать назначение?

Ответ №1:

Да, это возможно, выпадающий список представляет собой список, и поэтому элементы могут быть настроены отдельно с itemconfigure помощью метода. Однако я не знаю, как получить список выпадающего списка с помощью Python, но это можно сделать с помощью команд tcl:

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