根据原点更改Tkinter组合框中的文本颜色

时间:2019-04-12 10:46:59

标签: 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 个答案:

答案 0 :(得分: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()