【问题标题】:How to get a Treeview columns to fit the Frame it is within如何让 Treeview 列适合它所在的框架
【发布时间】:2019-09-03 13:09:58
【问题描述】:

动态更改树视图数据时,我希望行扩展到树视图框架的大小。目前,如果我使 GUI 全屏并重新填充数据,它只使用可用屏幕尺寸的一小部分,即列不会调整大小或拉伸以填充屏幕的宽度(我不太关心行填充)。我在下面制作了一个最小的工作示例:


import tkinter as tk
from tkinter import ttk
import random 

class App():

    def __init__(self):

        self.root = tk.Tk()

        self.frame = tk.Frame(self.root)
        self.frame.pack(expand=True, fill=tk.BOTH)

        self.tree = ttk.Treeview(self.frame, show="headings")
        self.tree.pack(expand=True, fill=tk.BOTH)

        self.button = ttk.Button(self.root, text="Fill", command=self.fill)
        self.button.pack(side=tk.BOTTOM,expand=True,fill=tk.X)

        self.root.mainloop()

    def fill(self):

        if self.has_data():
            self.tree.delete(*self.tree.get_children())

        i = random.randrange(1,10)
        self.tree["columns"]=tuple([str(i) for i in range(i)])

        for col in self.tree['columns']:
            self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
            self.tree.column(col, anchor=tk.CENTER)

        j = random.randrange(10)

        for j in range(j):

            self.tree.insert("", "end", values = tuple([k for k in range(i)]))

    def has_data(self):

        has_tree = self.tree.get_children()

        return True if has_tree else False


App()

请注意,调整 GUI 大小会自动调整列的大小。

【问题讨论】:

    标签: python tkinter treeview ttk


    【解决方案1】:

    问题是列是使用初始大小创建的(我认为默认为 200 像素),并且只有在树视图在创建后调整大小时才会拉伸。因此,您必须手动设置列宽以占用整个可用空间。为此,您可以使用树视图的column() 方法的width 参数:

    self.tree.column(col, width=col_width)
    

    其中col_width 是总宽度除以列数。将此代码合并到 fill() 函数中会给出

    def fill(self):
    
        if self.has_data():
            self.tree.delete(*self.tree.get_children())
    
        i = random.randrange(1,10)
        self.tree["columns"]=tuple([str(i) for i in range(i)])
    
        col_width = self.tree.winfo_width() // i # compute the width of one column
    
        for col in self.tree['columns']:
            self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
            self.tree.column(col, anchor=tk.CENTER, width=col_width)  # set column width
    
        j = random.randrange(10)
    
        for j in range(j):
    
            self.tree.insert("", "end", values = tuple([k for k in range(i)]))
    

    【讨论】:

    • 真的很感激这个,被卡在兔子洞里了。
    猜你喜欢
    • 2018-03-07
    • 2019-01-24
    • 2017-02-03
    • 2020-11-18
    • 2022-11-23
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多