2016-04-29 80 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

謝謝!正是我在找什麼。 –

相關問題