如何使两个Frame
占据窗口可用宽度的50%?
现在我只是让内容决定宽度并使用pack(side=Tkinter.LEFT)
,显然这并不会使它们的宽度相等。
我尝试使用grid()
,但是当我调整窗口大小时,我无法让它们调整大小。
修改
请注意,我希望能够调整窗口的大小,框架应该调整大小,使其始终为宽度的50%。
答案 0 :(得分:3)
您可以使用uniform
选项使用网格。把两半放在一个统一的小组中#34; (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)
答案 1 :(得分:0)
如果使用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()
答案 2 :(得分:-1)
我终于找到了一个正常工作的黑客。
一开始,我创建了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帧的任何数量的小部件,上述程序的输出总是与您期望的结果相同: