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():
。对于多个取消选择,我将只使用索引列表