如何制作带有侧面板和内容区域的可调整窗口?

Ken*_*ows 5 python resize tk-toolkit tkinter

我正在尝试使用Python和Tkinter在GUI设计中做一些相当标准的事情,我无法弄明白.我想尝试制作如下内容:

+------+----------------------+
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
+------+----------------------+
Run Code Online (Sandbox Code Playgroud)

使用侧边栏和主要内容区域进行非常简单的设置.我可以设置框架没有问题,但问题是当我去调整窗口大小时.我可以让侧边栏调整得很好,垂直但不是水平,并且粘在左侧,但主要内容区域拒绝水平填充其余空间.这就像边栏仍然占据相同的水平空间,即使它设置为仅在y方向上调整大小.

这是一些非常简单的代码来演示我的意思:

from Tkinter import *

root = Tk()

# sidebar
sidebar = Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=True, fill='y', side='left', anchor='nw')

# main content area
mainarea = Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

这是我尝试调整大小时会发生的事情:

不正确地调整布局

有任何想法吗?我的意思是,这必须是可行的,对吧?它实际上是一个标准.

Bry*_*ley 6

TL; DR:fill="both"用于侧边栏.

问题概述

您看到的额外空间属于侧边栏.因为您同时使用expand=true这两个小部件,所以当您调整窗口大小时,每个小部件都会被赋予额外空间的一部分.由于您没有fill在侧边栏的"x"方向指定,因此它会被赋予一些额外的空间,但它没有填充它.就像你问的那样,它正在 "y"方向填充它,并且主要区域完全填满它的空间fill="both".

您需要在侧边栏中填充"x"和"y"尺寸,或者将展开设置为固定尺寸.注意:当我说"固定大小"时,如果你使用它仍会填充它给出的区域fill=both,但是当你调整窗口大小时,所有额外的空间都会进入主窗口.

使用固定大小的侧边栏

为了有一个固定大小的侧边栏,把扩大关闭,但设置填充为两个.您希望它填充分配给它的区域,但如果窗口变大,您不希望该区域增长:

import Tkinter as tk

root = tk.Tk()

# sidebar
sidebar = tk.Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=False, fill='both', side='left', anchor='nw')

# main content area
mainarea = tk.Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

使用扩展侧边栏

有一个灵活大小的侧边栏,扩大转,这样它会给予额外的空间的一部分,当你调整窗口的大小.你想要填充两者,以便它填充它给出的空间.

import Tkinter as tk

root = tk.Tk()

# sidebar
sidebar = tk.Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=True, fill='both', side='left', anchor='nw')

# main content area
mainarea = tk.Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

摘要

这两个例子的唯一区别是使用expand=Trueexpand=False.扩展控制窗口调整大小时任何额外空间发生的变化.如果为true,则为窗口小部件分配额外的空间,以及将展开设置为true的任何其他窗口小部件.但是,在这两种情况下,您都希望侧边栏完全填充已给出的区域.所以在两种情况下你都想要fill="both".fill仅确定窗口小部件对其所给区域的影响(填充与否),但与窗口小部件是否获得或多或少的空间无关.

  • 展开:窗口调整大小时是否为窗口小部件提供更多空间
  • fill:窗口小部件是否填充给定的空间,或者部分空间是否为空