是否可以禁用列表框中的元素?

Is it possible to disable elements in a listbox?

我有这个代码片段:

import Tkinter as tk

class SampleApp(tk.Tk):
  def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)

    list = ['one','disable me','two']
    listbox = tk.Listbox(self,height=len(list))
    for item in list:
      listbox.insert(tk.END, item)
    listbox.pack()


if __name__ == "__main__":
  app = SampleApp()
  app.mainloop()

是否可以禁用第2条选择线,使其无法被选中?此外,是否可以用不同的(灰色)字体显示它?

没有实现此目标的方法。但是还有其他方法!使用 itemconfig(index, fg="gray") 您可以将字体颜色设置为灰色。您也可以将列表框绑定到 <<ListBoxSelection>> 事件并定义回调方法。在此方法中,只需使用 .curselection() 检查所选项目的索引,然后如果它与项目的索引匹配,则可以清除选择。

代码片段:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        list = ['one','disable me','two']

        self.listbox = tk.Listbox(self,height=len(list))
        for item in list:
            self.listbox.insert(tk.END, item)
        self.listbox.pack()
        self.disable_item(1)

    def disable_item(self,index):
        self.listbox.itemconfig(index, fg="gray")
        self.listbox.bind("<<ListboxSelect>>",
                          lambda event, index=index: self.no_selection(event, index))

    def no_selection(self, event, index):
        if self.listbox.curselection()[0] in str(index):
            self.listbox.selection_clear(index)

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

或者,您可以创建自己的小部件,它只包含和放置标签小部件,这样您就可以完全控制这些小部件。然后你可以随意设置Label的状态。