【问题标题】:Make two Frames occupy 50% of the available width each?让两个框架分别占据可用宽度的 50%?
【发布时间】:2016-11-05 09:04:51
【问题描述】:

如何让两个Frames 分别占据窗口可用宽度的 50%?

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

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

编辑

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

【问题讨论】:

    标签: python python-2.7 tkinter


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

    【讨论】:

    • 谢谢,但我希望能够调整窗口大小,这个解决方案似乎不允许这样做?
    • @BadCash 我做了一个黑客来解决你的问题。检查我的编辑。
    【解决方案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()
    

    【讨论】:

    • 这不会使框架的宽度相等,对吗?还是我错过了什么?
    • 是的。问题是,一旦我将任何内容添加到框架中,它们就会调整它们的宽度(如果两个框架中的内容宽度不完全相等)。
    • 嗯,一直在解决这个问题,但我似乎找不到使用 pack 方法的可靠的非 hacky 方法。
    【解决方案3】:

    您可以使用网格,使用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)
    

    【讨论】:

    • 完美,谢谢!我根据@BillalBEGUERADJ 上面的评论编辑了答案,现在效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2019-07-29
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多