Python 滚动条和大小调整赢得';t使用tkinter网格阵列和treeview

Python 滚动条和大小调整赢得';t使用tkinter网格阵列和treeview,python,tkinter,treeview,Python,Tkinter,Treeview,我已经用tkinter编写了一个应用程序前端,它使用了页面管理器布局,并且希望使用网格系统而不是包来进行布局。我无法让滚动条功能与网格布局一起工作,所以我用pack设置了它。这通常是可行的,但是我想要的布局需要一个网格(或者在使用pack时需要一堆额外的帧) 有人能看看我没有得到什么吗?我已经包含了使用pack系统的代码,它提供了一些接近我希望通过grid实现的东西。我认为可以工作的相应网格命令被注释掉了 我还删除了主类中的页面管理,并将其缩减为一个页面,以使问题更加清晰。我想长期保持页面管理

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

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

我还删除了主类中的页面管理,并将其缩减为一个页面,以使问题更加清晰。我想长期保持页面管理

谢谢你的关注

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()
将tkinter作为tk导入
从tkinter导入ttk
将tkinter.font作为tkFont导入
colheaders=['汽车','修理']
itemList=[('Hyundai','brakes'),('Honda','light'),
(‘雷克萨斯’、‘电池’)、(‘奔驰’、‘雨刷’),
(‘福特’、‘轮胎’)、(‘雪佛兰’、‘空气’),
(‘克莱斯勒’、‘活塞’、(‘丰田’、‘制动踏板’),
(‘宝马’、‘座椅’)]
def构建树(树、列标题、项列表):
树['columns']=colheaders
对于Colheaders中的每个项目:
tree.column(each,width=tkFont.Font().measure(each.title()))
tree.heading(each,text=each.title())
对于itemList中的项目:
插入树(“”,'end',value=项)
对于i,枚举(项目)中的每一项:
colwidth=int(1.3*tkFont.Font().measure(每个))
如果tree.列(colheaders[i],width=None)
首先,滚动条的工作方式没有问题。如果您能够缩小窗口,使某些项目变得模糊,滚动条将按预期工作。无需执行任何操作即可修复滚动条行为

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

第一个问题是使用
grid
在根窗口中放置
container
,但没有为根窗口中的行和列指定权重。因此,
container
不会展开以填充整个窗口,因此
container
中的任何内容都不能展开

因为这是根窗口中唯一的小部件,所以我认为使用pack更容易一些。由于要使用网格,您需要在
AppBT.\uuuu init\uuuuu
中添加以下内容:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1
您在
StatsTree
中重复了相同的问题-您使用
grid
tframe
放置在此帧中,但您没有配置
StatsTree
中的行和列的权重。这会阻止
t框架
展开,进而阻止树和滚动条展开

如果希望对
StatsTree
中的子窗口小部件使用网格,则需要将以下内容添加到
StatsTree


首先,滚动条的工作方式没有问题。如果您能够缩小窗口,使某些项目变得模糊,滚动条将按预期工作。无需执行任何操作即可修复滚动条行为

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

第一个问题是使用
grid
在根窗口中放置
container
,但没有为根窗口中的行和列指定权重。因此,
container
不会展开以填充整个窗口,因此
container
中的任何内容都不能展开

因为这是根窗口中唯一的小部件,所以我认为使用pack更容易一些。由于要使用网格,您需要在
AppBT.\uuuu init\uuuuu
中添加以下内容:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1
您在
statsttree
中重复了相同的问题-您正在使用
grid
t框架
放置在此框架中,但