2016-04-29 2 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() 

Можно ли отключить 2-й линии выбора, поэтому он не может быть выбран? Кроме того, можно ли показать его в другом (сероватом) шрифте?

ответ

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 вы можете создать свой собственный виджет, который просто содержать и место Label-виджеты, так что вы имеете полный контроль над этими виджетами. Затем вы можете установить состояние метки, как хотите.

+0

Спасибо! Именно то, что я искал. –