垂直展开一个小部件,同时使用 Tkinter/ttk 锁定另一个小部件
Expand one widget vertically while locking another with Tkinter/ttk
我在一个框架内有一个树视图,该框架位于另一个包含按钮的框架之上。我希望在调整 window 大小时扩展顶部框架,但不让按钮框架做同样的事情。
Python2.7.5 中的代码:
class MyWindow(Tk.Toplevel, object):
def __init__(self, master=None, other_stuff=None):
super(MyWindow, self).__init__(master)
self.other_stuff = other_stuff
self.master = master
self.resizable(True, True)
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
# Top Frame
top_frame = ttk.Frame(self)
top_frame.grid(row=0, column=0, sticky=Tk.NSEW)
top_frame.grid_columnconfigure(0, weight=1)
top_frame.grid_rowconfigure(0, weight=1)
top_frame.grid_rowconfigure(1, weight=1)
# Treeview
self.tree = ttk.Treeview(top_frame, columns=('Value'))
self.tree.grid(row=0, column=0, sticky=Tk.NSEW)
self.tree.column("Value", width=100, anchor=Tk.CENTER)
self.tree.heading("#0", text="Name")
self.tree.heading("Value", text="Value")
# Button Frame
button_frame = ttk.Frame(self)
button_frame.grid(row=1, column=0, sticky=Tk.NSEW)
button_frame.grid_columnconfigure(0, weight=1)
button_frame.grid_rowconfigure(0, weight=1)
# Send Button
send_button = ttk.Button(button_frame, text="Send",
command=self.on_send)
send_button.grid(row=1, column=0, sticky=Tk.SW)
send_button.grid_columnconfigure(0, weight=1)
# Close Button
close_button = ttk.Button(button_frame, text="Close",
command=self.on_close)
close_button.grid(row=1, column=0, sticky=Tk.SE)
close_button.grid_columnconfigure(0, weight=1)
我在其他地方创建实例是这样的:
window = MyWindow(master=self, other_stuff=self._other_stuff)
我尝试过的:
尝试锁定可调整大小,这只会使按钮消失。我也尝试改变权重,但我当前的配置是所有内容显示在屏幕上的唯一方式。
无论身高多长,它都应该是这样的:
我要防止的是:
提前致谢。
问题不在于按钮框架在变大,而是顶部框架在变大但没有使用全部 space。这是因为您给 top_frame
的第 1 行赋予了 1 的权重,但您没有在第 1 行中放置任何内容。额外的 space 由于其权重而被分配给第 1 行,但第 1 行是空的。
一种简单的可视化方法是将 top_frame
更改为 tk(而不是 ttk)框架,并暂时为其赋予独特的背景颜色。您会看到,当您调整 window 的大小时,top_frame
会填充整个 window,但它有一部分是空的。
像这样创建 top_frame
:
top_frame = Tk.Frame(self, background="pink")
... 当您调整 window 大小时,会产生如下图所示的屏幕。请注意,粉红色的 top_frame
已经显示出来,并且 button_frame
仍然是其首选尺寸。
您只需删除以下一行代码即可解决此问题:
top_frame.grid_rowconfigure(1, weight=1)
我在一个框架内有一个树视图,该框架位于另一个包含按钮的框架之上。我希望在调整 window 大小时扩展顶部框架,但不让按钮框架做同样的事情。
Python2.7.5 中的代码:
class MyWindow(Tk.Toplevel, object):
def __init__(self, master=None, other_stuff=None):
super(MyWindow, self).__init__(master)
self.other_stuff = other_stuff
self.master = master
self.resizable(True, True)
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
# Top Frame
top_frame = ttk.Frame(self)
top_frame.grid(row=0, column=0, sticky=Tk.NSEW)
top_frame.grid_columnconfigure(0, weight=1)
top_frame.grid_rowconfigure(0, weight=1)
top_frame.grid_rowconfigure(1, weight=1)
# Treeview
self.tree = ttk.Treeview(top_frame, columns=('Value'))
self.tree.grid(row=0, column=0, sticky=Tk.NSEW)
self.tree.column("Value", width=100, anchor=Tk.CENTER)
self.tree.heading("#0", text="Name")
self.tree.heading("Value", text="Value")
# Button Frame
button_frame = ttk.Frame(self)
button_frame.grid(row=1, column=0, sticky=Tk.NSEW)
button_frame.grid_columnconfigure(0, weight=1)
button_frame.grid_rowconfigure(0, weight=1)
# Send Button
send_button = ttk.Button(button_frame, text="Send",
command=self.on_send)
send_button.grid(row=1, column=0, sticky=Tk.SW)
send_button.grid_columnconfigure(0, weight=1)
# Close Button
close_button = ttk.Button(button_frame, text="Close",
command=self.on_close)
close_button.grid(row=1, column=0, sticky=Tk.SE)
close_button.grid_columnconfigure(0, weight=1)
我在其他地方创建实例是这样的:
window = MyWindow(master=self, other_stuff=self._other_stuff)
我尝试过的: 尝试锁定可调整大小,这只会使按钮消失。我也尝试改变权重,但我当前的配置是所有内容显示在屏幕上的唯一方式。
无论身高多长,它都应该是这样的:
我要防止的是:
提前致谢。
问题不在于按钮框架在变大,而是顶部框架在变大但没有使用全部 space。这是因为您给 top_frame
的第 1 行赋予了 1 的权重,但您没有在第 1 行中放置任何内容。额外的 space 由于其权重而被分配给第 1 行,但第 1 行是空的。
一种简单的可视化方法是将 top_frame
更改为 tk(而不是 ttk)框架,并暂时为其赋予独特的背景颜色。您会看到,当您调整 window 的大小时,top_frame
会填充整个 window,但它有一部分是空的。
像这样创建 top_frame
:
top_frame = Tk.Frame(self, background="pink")
... 当您调整 window 大小时,会产生如下图所示的屏幕。请注意,粉红色的 top_frame
已经显示出来,并且 button_frame
仍然是其首选尺寸。
您只需删除以下一行代码即可解决此问题:
top_frame.grid_rowconfigure(1, weight=1)