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