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

时间:2016-04-29 09:26:39

标签: python tkinter listbox tk

我有这段代码:

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

是否可以禁用第二条选择线,因此无法选择?另外,是否可以用不同的(浅灰色)字体显示它?

1 个答案:

答案 0 :(得分:4)

没有方法可以实现这一目标。但还有其他方法!使用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()

另外,您可以创建自己的Widget,它只包含并放置Label-Widgets,以便您可以完全控制这些小部件。然后,您可以根据需要设置标签的状态。