我用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()
首先,滚动条的工作方式没有问题。如果您能够缩小窗口以使某些项目变得模糊,滚动条将按预期工作。您不需要做任何事情来修复滚动条行为。在
一般来说,每当您使用
grid
将小部件放入另一个小部件中时,必须给父小部件的至少一行和一列赋予正权重。你有两个地方忘了那样做。在第一个问题是您使用
grid
将container
放在根窗口中,但是您没有给根窗口中的行和列赋予权重。因此,container
不会展开以填充整个窗口,因此container
中的任何内容也无法展开。在因为这是根窗口中唯一的小部件,所以在我看来使用pack要容易一些。由于要使用网格,因此需要在
AppBT.__init__
中添加以下内容:您对
StatsTree
重复相同的问题-您使用grid
将tframe
放在这个框架中,但是没有配置StatsTree
中的行和列的权重。这会阻止tframe
展开,而反过来又会阻止树和滚动条展开。在如果您希望将grid用于
^{pr2}$StatsTree
中的子窗口小部件,则需要将以下内容添加到StatsTree.__init__
相关问题 更多 >
编程相关推荐