垂直展开一个小部件,同时使用Tkinter / ttk锁定另一个小部件

时间:2017-09-29 16:33:18

标签: python tkinter widget treeview ttk

我在一个框架内部有一个树视图,它位于包含按钮的另一个框架的顶部。我希望顶部框架在我调整窗口大小时展开,但保持按钮框架不会这样做。

Python 2.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)

我尝试过: 尝试锁定可调整性,只使按钮消失。我也试过改变重量,但我当前的配置是屏幕上显示所有内容的唯一方式。

无论身高多长,它总是应该是什么样的: When it first launches

我想阻止的是什么: enter image description here

提前致谢。

1 个答案:

答案 0 :(得分:3)

问题不在于按钮框架在增长,而是顶部框架在增长,但并未使用它的所有空间。这是因为你给top_frame第1行的权重为1,但是你没有把任何东西放在第1行。由于它的重量,第1行会分配额外的空间,但第1行是空的。

可视化的一种简单方法是将top_frame更改为tk(而不是ttk)框架,并暂时为其提供独特的背景颜色。您将看到,当您调整窗口大小时,top_frame会整个窗口填充,但它部分为空。

像这样创建top_frame

top_frame = Tk.Frame(self, background="pink")

...在调整窗口大小时会生成如下图所示的屏幕。请注意,粉红色top_frame正在显示,而button_frame仍然是其首选大小。

screenshot showing colored empty space

您只需删除以下一行代码即可解决此问题:

top_frame.grid_rowconfigure(1, weight=1)