Python 3.x 如何刷新tkinter列表框

Python 3.x 如何刷新tkinter列表框,python-3.x,tkinter,Python 3.x,Tkinter,目标:我在列表框中选择一个选项。我想用黄色突出显示选项 问题:所有先前选择的选项也会以黄色突出显示。我只希望保留最新的选择为黄色,列表框中的所有其他内容为白色 import tkinter as tk root = tk.Tk() fontfamily = tk.font.families() def selectcolor(col=None): fontlist.config(bg='white') ##<--PROBLEM CODE option_selected

目标:我在列表框中选择一个选项。我想用黄色突出显示选项

问题:所有先前选择的选项也会以黄色突出显示。我只希望保留最新的选择为黄色,列表框中的所有其他内容为白色

import tkinter as tk


root = tk.Tk()
fontfamily = tk.font.families()

def selectcolor(col=None):
    fontlist.config(bg='white') ##<--PROBLEM CODE
    option_selected = fontlist.curselection()
    fontlist.itemconfig(option_selected[0], bg='yellow')

fontlist = tk.Listbox (root, bg='white')
fontlist.grid()

for eachfont in fontfamily:
    fontlist.insert(tk.END, eachfont)

fontlist.bind('<<ListboxSelect>>', selectcolor)
##<<ListboxSelect>> is magic, this option is not shown in_
##ebook John Shipman tkinter 8.5 reference
##.curselection() doesn't work as expected

tk.mainloop()

以前的项目保留黄色背景,因为您不会将其更改回需要记住最后标记的项目。但是使用selectbackground选项要容易得多。出于您的目的,以下内容是否有问题

import tkinter as tk
root = tk.Tk()
box = tk.Listbox(selectforeground='black', selectbackground='yellow')
box.pack()
box.insert('end', 'one', 'two', 'three')
#root.mainloop()

以前的项目保留黄色背景,因为您不会将其更改回需要记住最后标记的项目。但是使用selectbackground选项要容易得多。出于您的目的,以下内容是否有问题

import tkinter as tk
root = tk.Tk()
box = tk.Listbox(selectforeground='black', selectbackground='yellow')
box.pack()
box.insert('end', 'one', 'two', 'three')
#root.mainloop()
您可以对ListBox对象使用selectbackground选项。您不需要使用fontlist.configbg='white'行。解决方案是这样的:

import tkinter as tk


root = tk.Tk()
fontfamily = tk.font.families()

def selectcolor(col=None):
    fontlist.config(bg='white') ##unnecessary
    option_selected = fontlist.curselection()
    fontlist.itemconfig(option_selected[0], selectbackground='yellow')

fontlist = tk.Listbox (root, bg='white')
fontlist.grid()

for eachfont in fontfamily:
    fontlist.insert(tk.END, eachfont)

fontlist.bind('<<ListboxSelect>>', selectcolor)
##<<ListboxSelect>> is magic, this option is not shown in_
##ebook John Shipman tkinter 8.5 reference
##.curselection() doesn't work as expected

tk.mainloop()
您可以对ListBox对象使用selectbackground选项。您不需要使用fontlist.configbg='white'行。解决方案是这样的:

import tkinter as tk


root = tk.Tk()
fontfamily = tk.font.families()

def selectcolor(col=None):
    fontlist.config(bg='white') ##unnecessary
    option_selected = fontlist.curselection()
    fontlist.itemconfig(option_selected[0], selectbackground='yellow')

fontlist = tk.Listbox (root, bg='white')
fontlist.grid()

for eachfont in fontfamily:
    fontlist.insert(tk.END, eachfont)

fontlist.bind('<<ListboxSelect>>', selectcolor)
##<<ListboxSelect>> is magic, this option is not shown in_
##ebook John Shipman tkinter 8.5 reference
##.curselection() doesn't work as expected

tk.mainloop()

我认为,通过执行fontlist.configbg='white'可以尝试设置列表框的背景色,而不是其项目的背景色。例如,您可以跟踪最后一个选定的项目,并将其涂成白色,然后再将新选定的项目涂成黄色。问题是,由于所选项目的颜色仅在项目失去焦点后才可见(至少在我的情况下是如此),因此您将永远不会看到黄色项目…我希望有人拿出另一个智能解决方案…谢谢@nbro。我在selectcolor中添加了如下代码,似乎仍然不起作用。size=fontlist.size while size:fontlist.itemconfigsize-1,bg='white'size-=1我认为通过执行fontlist.configbg='white',您试图设置列表框的背景色,而不是其项目的背景色。例如,您可以跟踪最后一个选定的项目,并将其涂成白色,然后再将新选定的项目涂成黄色。问题是,由于所选项目的颜色仅在项目失去焦点后才可见(至少在我的情况下是如此),因此您将永远不会看到黄色项目…我希望有人拿出另一个智能解决方案…谢谢@nbro。我在selectcolor中添加了如下代码,似乎仍然不起作用。size=fontlist.size while size:fontlist.itemconfigsize-1,bg='white'size-=1由于我的新手身份,我无法向您投票。我现在变得贪婪了,在这里换了门柱。我有三个列表框来选择字体系列、大小和重量。您的解决方案“取消高亮显示”选择颜色,即当焦点从当前列表框移动到另一个列表框时,将丢失黄色选择。移动到其他列表框后,是否有办法保留黄色突出显示?您可以在上面找到新的解决方案。我已经延长了可能的回答。由于我的新手身份,我不能投票给你。我现在变得贪婪了,在这里换了门柱。我有三个列表框来选择字体系列、大小和重量。您的解决方案“取消高亮显示”选择颜色,即当焦点从当前列表框移动到另一个列表框时,将丢失黄色选择。移动到其他列表框后,是否有办法保留黄色突出显示?您可以在上面找到新的解决方案。我已经延长了可能的回答。由于我的新手身份,我不能投票给你。我现在变得贪婪了,在这里换了门柱。我有三个列表框来选择字体系列、大小和重量。您的解决方案“取消高亮显示”选择颜色,即当焦点从当前列表框移动到另一个列表框时,将丢失黄色选择。是否有办法在移动到其他列表框后保留黄色突出显示?可能性1:恢复到使用itemconfig,并添加恢复先前选择的背景,如我上面所建议的。这是tk在默认情况下所做的,除非您更改“selectmode”选项。可能性2:将按钮、标签或条目与列表框或下拉菜单相结合。请注意,ttk.Combobox组合了一个条目和下拉菜单。模拟具有只读但可单击文本的列表框。这将是最难的,但我知道它会起作用,因为空闲编辑窗口在不活动时不会丢失颜色高光。你甚至可以把所有三列都放在一个文本框中。由于我是新手,我不能给你投票。我现在变得贪婪了,在这里换了门柱。我有三个列表框来选择字体系列、大小和重量。您的解决方案“取消高亮显示”选择颜色,即当焦点从当前列表框移动到另一个列表框时,将丢失黄色选择。是否有办法在移动到其他列表框后保留黄色突出显示?可能性1:恢复到使用itemconfig,并添加恢复先前选择的背景,如我上面所建议的。这是tk在默认情况下所做的,除非您更改“selectmode”选项
按钮、标签或带有列表框或下拉菜单的条目。请注意,ttk.Combobox组合了一个条目和下拉菜单。模拟具有只读但可单击文本的列表框。这将是最难的,但我知道它会起作用,因为空闲编辑窗口在不活动时不会丢失颜色高光。甚至可以将所有三列放在一个文本框中。