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

时间:2014-03-07 22:45:00

标签: python resize tkinter tk

我正在尝试使用Python和Tkinter在GUI设计中做一些非常标准的事情,我无法弄明白。我正在尝试制作以下内容:

+------+----------------------+
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
|      |                      |
+------+----------------------+

使用侧边栏和主要内容区域进行非常简单的设置。我可以设置框架布局没有问题,但问题出现在我去调整窗口大小。我可以让侧边栏调整得很好,垂直但不是水平,并且粘在左侧,但主要内容区域拒绝水平填充其余空间。就像侧边栏仍占用相同的水平空间,即使它设置为仅在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()

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

improperly-resizing layout

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

1 个答案:

答案 0 :(得分:5)

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()

使用展开式侧边栏

要使用灵活大小的侧边栏,请在上展开,以便在调整窗口大小时为其提供额外空间的一部分。你希望填充两者,以便它填充它给出的空间。

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()

<强>摘要

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

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