如何在Python中禁用checkboxtreeview小部件中的复选框

时间:2019-05-06 11:49:00

标签: python checkbox treeview

我在我的Python脚本中使用了ttkwidgets模块中的checkboxtreeview小部件。通过将状态设置为“选中”,“未选中”或“三态”,我可以使项目的复选框相应地出现在预期的位置。

是否有任何方法可以禁用该复选框,即用户无法再通过单击更改状态?

非常感谢您的帮助!

1 个答案:

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