以编程方式折叠Tix hlist清单中的分支?

时间:2018-07-11 23:00:43

标签: python tix

对于我在Python中的第一个GUI,我将Tix用于其内置的“清单”和“ hlist”小部件,以使用树的每个分支和叶子的复选框来构建树视图。它大部分都运行良好。但是我无法弄清的一件事是如何以编程方式折叠树的分支。

我希望在初次显示清单时折叠一些分支,并希望有一个“全部折叠”按钮和一个“全部展开”按钮。

下面是我代码的清单部分。我希望checkList.close(i["id"])行可以关闭分支,但事实并非如此。

有人能教我正确的方式以编程方式折叠Tix清单/ hlist树中的分支吗?

checkList = Tix.CheckList(win)
checkList.pack(in_=frameTop, side=Tix.LEFT, fill=Tix.BOTH, expand=Tix.YES)
checkList.hlist.config(bg='white', selectbackground='white', selectforeground='black', header=True, browsecmd=itemEvent)
checkList.hlist.header_create(0, itemtype=Tix.TEXT, text='Select layers to add to the map', relief='flat')
checkList.hlist.bind("<ButtonRelease-1>", checkListClicked)

for i in items:
    try:
        checkList.hlist.add(i["id"], text=i["text"])
    except:
        print "WARNING:  Failed to add item to checklist:  {} - {}".format(i["id"], text=i["text"])
    checkList.close(i["id"])
    checkList.setstatus(i["id"], "off")

checkList.autosetmode()

我希望以下方法能起作用(例如,在上述for循环内):

checkList.setmode(i["id"], "close")
checkList.close(i["id"])

但是它给了我错误AttributeError: setmode。奇怪,因为据我所知setmode应该可用,对吧?

1 个答案:

答案 0 :(得分:0)

我终于想出了一种方法来解决这个问题。我完全放弃了setmode,因为它似乎不适用于我的Python环境;那么既然我已经有autosetmode了,那么我可以在close运行之后使用autosetmode命令。

这意味着我必须循环两次,这感觉有点浪费,但这没什么大不了的,至少我现在可以得到所需的结果。

这是终于为我工作的东西(下)。在这种情况下,我将为具有父项的每个项目将分支设置为关闭(即,顶级项目处于打开状态,而其他所有项目均处于关闭状态)。

checkList = Tix.CheckList(win)
checkList.pack(in_=frameTop, side=Tix.LEFT, fill=Tix.BOTH, expand=Tix.YES)
checkList.hlist.config(bg='white', selectbackground='white', selectforeground='black', header=True, browsecmd=itemEvent)
checkList.hlist.header_create(0, itemtype=Tix.TEXT, text='Select layers to add to the map', relief='flat')
checkList.hlist.bind("<ButtonRelease-1>", checkListClicked)

for i in items:
    try:
        checkList.hlist.add(i["id"], text=i["text"])
    except:
        print "WARNING:  Failed to add item to checklist:  {} - {}".format(i["id"], text=i["text"])
    # Delete this next line
    #checkList.close(i["id"])
    checkList.setstatus(i["id"], "off")

checkList.autosetmode()
#  Add these following lines (include whatever condition you like in the 'if')
for i in items:
    if checkList.hlist.info_parent(i["id"]):
        checkList.close(i["id"])