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

Python 是否可以禁用列表框中的元素?,python,tkinter,listbox,tk,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:

我有以下代码片段:

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

是否可以禁用第二个选择行,使其无法选择?此外,是否可以用不同的(灰色)字体显示它?

没有实现此目标的方法。但是还有其他方法!使用
itemconfig(index,fg=“gray”)
可以将字体颜色设置为灰色。您还可以将列表框绑定到
事件,并定义回调方法。在该方法中,只需使用
.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']
    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()
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()
将Tkinter作为tk导入
类SampleApp(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
列表=['one'、'disable me'、'two']
self.listbox=tk.listbox(self,height=len(list))
对于列表中的项目:
self.listbox.insert(tk.END,item)
self.listbox.pack()
自我禁用_项(1)
def禁用_项(自身,索引):
self.listbox.itemconfig(index,fg=“gray”)
self.listbox.bind(“,
lambda事件,索引=index:self.no_选择(事件,索引))
def no_选择(自身、事件、索引):
如果str(索引)中的self.listbox.curselection()[0]:
self.listbox.selection\u clear(索引)
如果名称=“\uuuuu main\uuuuuuuu”:
app=SampleApp()
app.mainloop()

或者,您可以创建自己的小部件,它只包含并放置标签小部件,这样您就可以完全控制这些小部件。然后,您可以根据需要设置标签的状态。

没有实现此目标的方法。但是还有其他方法!使用
itemconfig(index,fg=“gray”)
可以将字体颜色设置为灰色。您还可以将列表框绑定到
事件,并定义回调方法。在该方法中,只需使用
.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']
    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()
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()
将Tkinter作为tk导入
类SampleApp(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
列表=['one'、'disable me'、'two']
self.listbox=tk.listbox(self,height=len(list))
对于列表中的项目:
self.listbox.insert(tk.END,item)
self.listbox.pack()
自我禁用_项(1)
def禁用_项(自身,索引):
self.listbox.itemconfig(index,fg=“gray”)
self.listbox.bind(“,
lambda事件,索引=index:self.no_选择(事件,索引))
def no_选择(自身、事件、索引):
如果str(索引)中的self.listbox.curselection()[0]:
self.listbox.selection\u clear(索引)
如果名称=“\uuuuu main\uuuuuuuu”:
app=SampleApp()
app.mainloop()

或者,您可以创建自己的小部件,它只包含并放置标签小部件,这样您就可以完全控制这些小部件。然后,您可以根据需要设置标签的状态。

谢谢!这正是我想要的。奇妙的解决方案,如此优雅。只需将self.listbox.curselection()[0]的注释定义为str(self.listbox.curselection()[0]),否则会出现错误。另外,您想知道是否可以将其配置为适用于多个项目?我注意到,在使用此方法禁用两个项目后,第一个项目变得可选择(尽管仍然是灰色的)。您是对的,但解决方案是针对Python2.7的,它具有一种完全不同的行为。最好在curselection()中检查索引,如:
if index in self.listbox.curselection():
。对于多次取消选择,我只会使用一个指示符列表!这正是我想要的。奇妙的解决方案,如此优雅。只需将self.listbox.curselection()[0]的注释定义为str(self.listbox.curselection()[0]),否则会出现错误。另外,您想知道是否可以将其配置为适用于多个项目?我注意到,在使用此方法禁用两个项目后,第一个项目变得可选择(尽管仍然是灰色的)。您是对的,但解决方案是针对Python2.7的,它具有一种完全不同的行为。最好在curselection()中检查索引,如:
if index in self.listbox.curselection():
。对于多个取消选择,我将只使用索引列表