滚动条和调整大小不适用于 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
将小部件放入另一个小部件时,您必须至少为父小部件的一行和一列赋予正权重。你忘记在两个地方这样做。
第一个问题是您使用 grid
将 container
放在根 window 中,但您没有为根 window。因此,container
不会扩展以填充整个 window,因此 container
中的任何内容也无法扩展。
由于这是根 window 中唯一的小部件,我认为使用 pack 更容易一些。由于要使用网格,因此需要在 AppBT.__init__
中添加以下内容:
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
您在 StatsTree
中重复了同样的问题 - 您正在使用 grid
将 tframe
放置在此框架中,但您没有配置行和列的权重StatsTree
。这会阻止 tframe
展开,进而阻止树和滚动条展开。
如果您希望在 StatsTree
中的子控件中使用网格,则需要将以下内容添加到 StatsTree.__init__
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1
我已经用 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
将小部件放入另一个小部件时,您必须至少为父小部件的一行和一列赋予正权重。你忘记在两个地方这样做。
第一个问题是您使用 grid
将 container
放在根 window 中,但您没有为根 window。因此,container
不会扩展以填充整个 window,因此 container
中的任何内容也无法扩展。
由于这是根 window 中唯一的小部件,我认为使用 pack 更容易一些。由于要使用网格,因此需要在 AppBT.__init__
中添加以下内容:
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
您在 StatsTree
中重复了同样的问题 - 您正在使用 grid
将 tframe
放置在此框架中,但您没有配置行和列的权重StatsTree
。这会阻止 tframe
展开,进而阻止树和滚动条展开。
如果您希望在 StatsTree
StatsTree.__init__
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1