2016-04-29 47 views
0

我有这样的代码片段:是否可以禁用列表框中的元素?

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

是否有可能禁用第二选择线,所以它不能被选中?另外,是否可以用不同的(灰色)字体显示它?

回答

3

没有办法来实现这个目标。但还有其他方法!通过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() 

Alternativly您可以创建自己的Widget,其中只包含和地点标签的小部件,所以你有这些部件的完全控制。然后,您可以根据需要设置标签的状态。

+0

谢谢!正是我在找什么。 –

相关问题