【发布时间】:2016-11-05 09:04:51
【问题描述】:
如何让两个Frames 分别占据窗口可用宽度的 50%?
现在我只是让内容决定宽度并使用pack(side=Tkinter.LEFT),显然这不会使它们的宽度相等。
我尝试改用grid(),但是当我调整窗口大小时,我无法让它们调整大小。
编辑
请注意,我希望能够调整窗口大小,并且框架应随之调整大小,使其始终为宽度的 50%。
【问题讨论】:
标签: python python-2.7 tkinter
如何让两个Frames 分别占据窗口可用宽度的 50%?
现在我只是让内容决定宽度并使用pack(side=Tkinter.LEFT),显然这不会使它们的宽度相等。
我尝试改用grid(),但是当我调整窗口大小时,我无法让它们调整大小。
编辑
请注意,我希望能够调整窗口大小,并且框架应随之调整大小,使其始终为宽度的 50%。
【问题讨论】:
标签: python python-2.7 tkinter
我终于想出了一个可以正常工作的技巧。
一开始,我创建了 2 个框架,其中一个有一个带有(有意)长文本的标签,另一个是一个简单的按钮。您可以根据需要向两个框架添加任意数量的小部件。
这个想法是绑定一个回调方法,该方法考虑到主窗口的新尺寸(以防用户用鼠标拉伸或移动窗口)并相应地调整 2 帧的大小。
这是使用<Configure> 事件实现的,该事件提供了新的尺寸来设置我们的 3 个主要小部件(主窗口和 2 个框架)。
下一步是解决您在 @StevenSummers 的回答中提到的问题。为此,我们可以依赖grid_propagate() 来启用或禁用几何传播。
计划:
让我们把这些想法付诸实践(一个简单的例子来实现这些想法;我对高度做了同样的事情,但如果你不需要它,你可以忽略它):
import Tkinter as Tk
# Main window
master = Tk.Tk()
# Callback event that resizes the main components
def resize_it(event):
global master # Main Window
global a # Red Frame
global b # Blue Frame
#Reconfigure the main window's and frames' dimensions
a.configure(width=event.width/2, height=event.height/2)
b.configure(width=event.width/2, height=event.height/2)
master.configure(width=event.width, height=event.height)
#Create a red (first) Frame
a = Tk.Frame(master, bg='red')
a.pack(side='left', expand=True, fill=Tk.BOTH)
# Draw a button on frame a
a1 = Tk.Button(a, text='Button 1')
a1.grid(row=0, column=0)
# Disable geometry propagation
a.grid_propagate(0)
#Create a blue (second) Frame
b = Tk.Frame(master, bg='blue')
b.pack(side='left', expand=True, fill=Tk.BOTH)
# Draw a label on frame b
l1 = Tk.Label(b, text='Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1Label 1')
l1.grid(row=0, column=0)
# Disable geometry propagation on frame b
# Note: always after adding ALL the desired widgets to b. Same note for frame b
b.grid_propagate(0)
master.bind('<Configure>', resize_it)
#Start program
master.mainloop()
演示:
每当您使用鼠标调整主窗口的大小以及添加到 2 帧的任何数量的小部件时,上述程序的输出总是与您期望的结果相同:
【讨论】:
如果使用pack方法,你应该使用expand和fill
例子
import Tkinter as tk
root = tk.Tk()
left_frame = tk.Frame(root, bg = 'yellow')
left_frame.pack(side = tk.LEFT, expand = True, fill = tk.BOTH)
right_frame = tk.Frame(root, bg = 'lime')
right_frame.pack(side = tk.LEFT, expand = True, fill = tk.BOTH)
root.mainloop()
【讨论】:
您可以使用网格,使用uniform 选项。通过将uniform 选项设置为相同的值,将两半放在一个“统一组”中,它们将具有相同的大小。要使列随窗口增大/缩小,请赋予它们相同的权重。
例子:
frame1 = tk.Frame(parent, ...)
frame2 = tk.Frame(parent, ...)
frame1.grid(row=0, column=0, sticky="nsew")
frame2.grid(row=0, column=1, sticky="nsew")
parent.grid_columnconfigure(0, weight=1, uniform="group1")
parent.grid_columnconfigure(1, weight=1, uniform="group1")
parent.grid_rowconfigure(0, weight=1)
【讨论】: