列的自动最小宽度'#0'在tkinter.TreeView中

时间:2017-12-04 21:55:57

标签: python-3.x tkinter treeview

tkinter.TreeView有第一个默认列(标识符#0)。例如,这是为了持有' +'唱树。

当我添加其他列时,第一列会调整大小并且大到很宽。

enter image description here

这是生成此树视图的代码。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
from tkinter import ttk

root = Tk()

tree = ttk.Treeview(root, columns=('one'))
idx = tree.insert(parent='', index=END, values=('AAA'))
tree.insert(parent=idx, index=END, values=('child'))

tree.column('#0', stretch=False)  # NO effect!

tree.pack()
root.mainloop()

我希望第一列(#0)的最小固定宽度取决于其中的+号。关键是由于不同的桌面环境和用户设置,该列的宽度因系统而异。因此,当我在这里设置固定大小的像素时,它会打破Python3和Tkinter的平台独立性。

1 个答案:

答案 0 :(得分:1)

在窗口上,展开/折叠按钮似乎是根据大小动态绘制的,根据this minwidth选项默认为20.我会编写一个方法来计算{{1}这样它可以解释深度和图像以及文字宽度+20。

话虽如此,使用this answer可以编写一个方法来修复minwidth Tk默认值的列宽,方法是在那个确切的位置打破tagbind:

minwidth

一个完整的例子:

#the minimum width default that Tk assigns
minwidth = tree.column('#0', option='minwidth')

tree.column('#0', width=minwidth)

#disabling resizing for '#0' column particularly
def handle_click(event):
    if tree.identify_region(event.x, event.y) == "separator":
        if tree.identify_column(event.x) == '#0':
            return "break"

#to have drag drop to have no effect
tree.bind('<Button-1>', handle_click)
#further disabling the double edged arrow display
tree.bind('<Motion>', handle_click)