【问题标题】:Scrollbar and resizing won't work with tkinter grid array and treeview滚动条和调整大小不适用于 tkinter 网格数组和树视图
【发布时间】:2016-05-03 19:38:09
【问题描述】:

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

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

我还把主类中的页面管理去掉了,减少到一页,让问题更清晰。我想长期保持页面管理......

感谢收看!

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()

【问题讨论】:

    标签: python tkinter treeview


    【解决方案1】:

    首先,滚动条的工作方式没有任何问题。如果您能够缩小窗口以使某些项目被遮挡,则滚动条将按预期工作。您无需执行任何操作来修复滚动条行为。

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

    第一个问题是您使用gridcontainer 放置在根窗口中,但是您没有为根窗口中的行和列赋予权重。因此,container 不会展开以填满整个窗口,因此 container 中的任何内容也无法展开。

    由于这是根窗口中唯一的小部件,因此我认为使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多