我在我的Python脚本中使用了ttkwidgets模块中的checkboxtreeview小部件。通过将状态设置为“选中”,“未选中”或“三态”,我可以使项目的复选框相应地出现在预期的位置。
是否有任何方法可以禁用该复选框,即用户无法再通过单击更改状态?
非常感谢您的帮助!
答案 0 :(得分:3)
您可以添加“已禁用”标签,并签入_box_click()
函数,该函数在用户单击树中的项目时会在其状态更改前被禁用。
在下面的代码中,我复制了_box_click()
方法的源代码并添加了
if self.tag_has("disabled", item):
return # do nothing when disabled
禁用状态更改。
我还配置了“ disabled”标记,以使字体更浅,以便能够查看禁用的项目:self.tag_configure("disabled", foreground='grey')
下面是完整的代码,并带有示例:
import ttkwidgets as tw
import tkinter as tk
class CheckboxTreeview(tw.CheckboxTreeview):
def __init__(self, master=None, **kw):
tw.CheckboxTreeview.__init__(self, master, **kw)
# disabled tag to mar disabled items
self.tag_configure("disabled", foreground='grey')
def _box_click(self, event):
"""Check or uncheck box when clicked."""
x, y, widget = event.x, event.y, event.widget
elem = widget.identify("element", x, y)
if "image" in elem:
# a box was clicked
item = self.identify_row(y)
if self.tag_has("disabled", item):
return # do nothing when disabled
if self.tag_has("unchecked", item) or self.tag_has("tristate", item):
self._check_ancestor(item)
self._check_descendant(item)
elif self.tag_has("checked"):
self._uncheck_descendant(item)
self._uncheck_ancestor(item)
root = tk.Tk()
tree = CheckboxTreeview(root)
tree.pack()
tree.insert("", "end", "1", text="1")
tree.insert("1", "end", "11", text="11", tags=['disabled'])
tree.insert("1", "end", "12", text="12")
tree.insert("11", "end", "111", text="111")
tree.insert("", "end", "2", text="2")
root.mainloop()