簡體   English   中英

如何獲得一個Treeview列以適合它所在的框架

[英]How to get a Treeview columns to fit the Frame it is within

動態更改樹視圖數據時,我希望這些行擴展到樹視圖框架的大小。 當前,如果我將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的大小會自動調整列的大小。

問題是,創建的列具有初始大小(我認為默認值為200像素),並且只有在樹視圖創建后調整了樹形大小時才會拉伸。 因此,您將必須手動設置列寬以占據整個可用空間。 為此,您可以使用treeview的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)]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM