使两个框架占据每个可用宽度的50%?

时间:2016-07-03 14:42:45

标签: python python-2.7 tkinter

如何使两个Frame占据窗口可用宽度的50%?

现在我只是让内容决定宽度并使用pack(side=Tkinter.LEFT),显然这并不会使它们的宽度相等。

我尝试使用grid(),但是当我调整窗口大小时,我无法让它们调整大小。

修改

请注意,我希望能够调整窗口的大小,框架应该调整大小,使其始终为宽度的50%。

3 个答案:

答案 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帧的任何数量的小部件,上述程序的输出总是与您期望的结果相同:

enter image description here