垂直展开一个小部件,同时使用 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)