滚动条和调整大小不适用于 tkinter 网格阵列和树视图

Scrollbar and resizing won't work with tkinter grid array and treeview

我已经用 tkinter 编写了应用程序前端,它使用页面管理器布局,并且想用网格系统而不是 pack 来布置它。我无法让滚动条功能与网格布局一起工作,所以我用 pack 设置它。这通常可行,但我想要的布局将需要一个网格(或使用 pack 时一堆额外的框架)。

有人可以看看我没有得到什么吗?我已经包含了使用 pack 系统的代码,它提供了一些接近我想用网格实现的东西。我认为可以使用的相应网格命令被注释掉了。

我也把主要class里的页面管理去掉,缩成一页,让问题更清楚。我想长期保持页面管理运行...

感谢观看!

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont

colHeadings = ['car', 'repair']
itemList = [('Hyundai', 'brakes'),('Honda', 'light'), 
            ('Lexus', 'battery'), ('Benz', 'wiper'), 
            ('Ford', 'tire'), ('Chevy', 'air'), 
            ('Chrysler', 'piston'), ('Toyota', 'brake pedal'), 
            ('BMW', 'seat')]

def buildtree(thetree, colHeadings, itemList):
    thetree['columns'] = colHeadings
    for each in colHeadings:
        thetree.column(each, width=tkFont.Font().measure(each.title()))
        thetree.heading(each, text=each.title())
    for item in itemList:
        thetree.insert('', 'end', values=item)
        for i, each in enumerate(item):
            colwidth = int(1.3*tkFont.Font().measure(each))
            if thetree.column(colHeadings[i], width=None) < colwidth:
                thetree.column(colHeadings[i], width=colwidth)

class AppBT(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = ttk.Frame(self)
        frame = StatsTree(container)

        container.pack(side="top", fill="both", expand=1)
        frame.pack(side="top", fill="y",expand=1)
        # container.grid(row=0, column=0, sticky="nsew")
        # container.grid_rowconfigure(0, weight=1)
        # container.grid_columnconfigure(0, weight=1)
        # frame.grid(row=0, column=0, sticky="ns")


class StatsTree(ttk.Frame):
    def __init__(self, parent):
        ttk.Frame.__init__(self, parent)

        tframe = ttk.Frame(self)
        yscrollbar = ttk.Scrollbar(tframe, orient="vertical")
        tree = ttk.Treeview(tframe)

        yscrollbar.config(command=tree.yview)
        tree.config(yscrollcommand=yscrollbar.set)

        buildtree(tree, colHeadings, itemList)

        tree.pack(side="left", fill="y")
        yscrollbar.pack(side="right", fill="y")
        tframe.pack(side="top", fill="y", expand=1, padx=10, pady=10)

        # tframe.grid(row=0, column=0, sticky="ns", padx=10, pady=10)
        # tframe.grid_rowconfigure(0, weight=1)
        # tframe.grid_columnconfigure(0, weight=1)
        # tree.grid(row=0, column=0, sticky="ns")
        # tree.grid_rowconfigure(0, weight=1)
        # tree.grid_columnconfigure(0, weight=1)
        # yscrollbar.grid(row=0, column=1, sticky="ns")
        # yscrollbar.grid_rowconfigure(0, weight=1)
        # yscrollbar.grid_columnconfigure(1, weight=1)


app = AppBT()
app.geometry("800x600")
app.mainloop()

首先,滚动条的工作方式没有任何问题。如果您能够缩小 window 以便隐藏某些项目,滚动条将按预期工作。您无需执行任何操作即可修复滚动条行为。

作为一般经验法则,每当您使用 grid 将小部件放入另一个小部件时,您必须至少为父小部件的一行和一列赋予正权重。你忘记在两个地方这样做。

第一个问题是您使用 gridcontainer 放在根 window 中,但您没有为根 window。因此,container 不会扩展以填充整个 window,因此 container 中的任何内容也无法扩展。

由于这是根 window 中唯一的小部件,我认为使用 pack 更容易一些。由于要使用网格,因此需要在 AppBT.__init__ 中添加以下内容:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)

您在 StatsTree 中重复了同样的问题 - 您正在使用 gridtframe 放置在此框架中,但您没有配置行和列的权重StatsTree。这会阻止 tframe 展开,进而阻止树和滚动条展开。

如果您希望在 StatsTree

中的子控件中使用网格,则需要将以下内容添加到 StatsTree.__init__
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1