【问题标题】:Is it possible to disable elements in a listbox?是否可以禁用列表框中的元素?
【发布时间】:2016-08-24 09:25:10
【问题描述】:

我有这个代码sn-p:

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

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

【问题讨论】:

    标签: python tkinter listbox tk


    【解决方案1】:

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

    代码sn-p:

    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的状态了。

    【讨论】:

    • 谢谢!正是我想要的。
    • 很棒的解决方案,非常优雅。只是一个注释 self.listbox.curselection()[0] 也需要定义为 str(self.listbox.curselection()[0]) 否则你会得到一个错误。
    • 另外,想知道这是否可以配置为适用于多个项目?我注意到使用此方法禁用两个项目后,第一个变为可选(尽管仍然是灰色)
    • 你是对的,但解决方案是针对 Python 2.7,它的行为略有不同。最好检查curselections 中的索引,如下所示:if index in self.listbox.curselection():。对于多个取消选择,我只会使用索引列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多