文章目录

  • 初步
  • 回调函数
  • 绑定滚动条


初步

Treeview是ttk中的树形表组件,功能十分强大,非常适用于系统路径的表达。为了知道属性图到底是什么,下面先做个最简单的树形图,想要表达中国、日本还有美国的几个主要城市的隶属关系

  • 中国
  • 北京
  • 香港
  • 台北
  • 美国
  • 纽约
  • 华盛顿
  • 日本
  • 东京
  • 大版

其绘图结果如下

python tk Treeview 行显示不全_GUI

其代码如下

import tkinter as tk
from tkinter import ttk
 
dct = {
    "中国" : ["北京", "台北", "香港"],
    "美国" : ["纽约", "华盛顿"],
    "日本" : ["东京", "大阪"]
}

win = () # 设置窗口大小

# 此为根节点
tree = ttk.Treeview(win, show = "tree")

for key in dct:
    father = tree.insert("", 0, key, text=key)
    for v in dct[key]:
        tree.insert(father, 1, v, 
            text=v, values=(f"{key}-{v}"))

tree.pack(side=tk.LEFT, expand = True, fill = tk.BOTH)
win.mainloop()

首先,我们创建了一个字典,用于构成树形图的节点。

接下来,ttk.Treeview生成一个树形图,这个几乎没什么问题,和tkinter其他所有组件完全一致,只是多了个"show",表明这是个树形图,说明Treeview这个组件或许还有其他形式。

然后,就到了唯一关键的函数insert,其输入参数分别为父节点、所在列、节点ID,如果不输入节点ID,那么将有系统分配,这个参数并不是必须的。而后text为其显示的名称,非常直观。最后values是一个并未体现在界面上的值,但可以调用。

回调函数

Treeview有三种基本的回调函数,分别当选择节点、打开父节点和关闭父节点时触发。仍以上述Treeview为例,其效果如下

python tk Treeview 行显示不全_tkinter_02

具体修改方案为,在mainloop之前,添加如下代码

def slct(evt):
    for item in tree.selection():
        print(tree.item(item, "values"))

def open_(evt):
    for item in tree.selection():
        print(f"{item} has opened")

def close(evt):
    for item in tree.selection():
        print(f"{item} has closed")

tree.bind('<<TreeviewSelect>>', slct)
tree.bind('<<TreeviewOpen>>', open_)
tree.bind('<<TreeviewClose>>', close)

其中,绑定的三个函数slct, open_和close,分别对应选中节点、打开或关闭节点时触发。其函数内容则基本相同,都是打印当前选中节点的相关值,其中父节点直接输出节点的名字,子节点则输出其内部定义的values。

通过tree.selection()可获取选中内容,其返回值是一个元组;如果改用tree.focus(),则可返回焦点所在的节点。

当然,这两个函数不仅有读取的功能,当二者有输入时,例如focus(item)可让item获得焦点;而selection(selop, items),若selop为None,则以列表形式返回所有items,若selop指定了选择方法,则按照给定的方法选中相应的items。

绑定滚动条

这种树形图如果全都展开,一定会特别长,为了在有限的区间展示无限多的树形图节点,就需要为其绑定滚动条,其实很简单,只需在mainloop前面添加下面几行代码即可

scroll = ttk.Scrollbar(win)
scroll.config(command=tree.yview)

scroll.pack(side=tk.RIGHT, fill=tk.Y)
# 给treeview添加配置
tree.configure(yscrollcommand=scroll.set)

效果如下

python tk Treeview 行显示不全_treeview_03