将小部件放置在框架中时如何保持框架尺寸?

时间:2019-05-16 13:31:40

标签: python tkinter

为了学习Tkinter,我在下面整理了程序。当我将按钮移出界面时,显示时两个框架的大小相同。但是,如果将按钮放在任一框架中,则带有按钮的框架会缩小。

import tkinter as tk
def main():
    main_win = tk.Tk()
    main_win.title('just playing around')
    main_win.geometry('350x450')

    main_win.rowconfigure(0, weight=1)
    main_win.rowconfigure(1, weight=1)
    main_win.columnconfigure(0, weight=1)
    main_win.columnconfigure(1, weight=1)
    main_win.columnconfigure(2, weight=1)

    frm1 = tk.Frame(main_win, bg='red', height=100, width=350)

    frm1.grid(row=0, sticky='nsew')
    frm1.rowconfigure(0, weight=1)
    frm1.rowconfigure(1, weight=1)
    frm1.rowconfigure(2, weight=1)
    frm1.columnconfigure(0, weight=1)

    frm2 = tk.Frame(main_win, bg='green', height=150, width=350)
    frm2.grid(row=1, sticky='nsew')
    frm2.rowconfigure(0, weight=1)
    frm2.rowconfigure(1, weight=1)
    frm2.rowconfigure(2, weight=1)
    frm2.columnconfigure(0, weight=1)

    quit_btn = tk.Button(frm1, bg='lightgrey', text='Quit',
                         command=main_win.destroy)
    quit_btn.grid(row=1)

    main_win.mainloop()

    return 0

if __name__ == '__main__':
    main()

为什么会发生这种情况?保持框架大小相同需要什么?

(此外,调整窗口大小会导致框架在垂直方向上调整大小,而不会在水平方向上调整。为什么会发生这种情况,以及如何在两个方向(或在两个方向都将其关闭)上进行大小调整?)

1 个答案:

答案 0 :(得分:1)

因此,因为默认情况下tkinter会强制将框架调整为窗口小部件的大小,即使您在将框架放置到窗口中后立即为其设置大小,也会将其调整为窗口小部件的大小。相反,我们需要告诉tkinter不允许传播。因此,如果我们禁止在容纳按钮的框架内传播,它将不再调整大小以适合按钮。

对于由于第1列和第2列的权重而导致在调整大小时无法向右扩展的问题。除非您计划在这些列中添加某些内容,否则您需要删除这些列的权重。

由于您向所有3列添加了权重,因此列在容器中的调整大小将保持相同。在这种情况下,因为当您开始调整窗口大小时,第1列和第2列的大小为零,所以您会注意到第0列正在调整大小,但速度不足以填充窗口。这是因为由于设置了权重,第1列和第2列的增长速度也与第0列相同。

因此,要回答您的评论,如果以后计划使用这些列,并且希望这些列也随屏幕增长,可以保留第1列和第2列的权重。

尝试此代码,如果您有任何疑问,请告诉我。

import tkinter as tk


def main():
    main_win = tk.Tk()
    main_win.title('just playing around')
    main_win.geometry('350x450')

    # main_win.rowconfigure(0, weight=1) # disable this
    main_win.rowconfigure(1, weight=1)
    main_win.columnconfigure(0, weight=1)
    # main_win.columnconfigure(1, weight=1) # disable this
    # main_win.columnconfigure(2, weight=1) # disable this

    frm1 = tk.Frame(main_win, bg='red', height=100, width=350)
    frm1.grid(row=0, column=0, sticky='nsew')

    frm1.grid_propagate(False) # add grid_propagate(False) after your grid placement.

    frm1.rowconfigure(0, weight=1)
    frm1.rowconfigure(1, weight=1)
    frm1.rowconfigure(2, weight=1)
    frm1.columnconfigure(0, weight=1)

    frm2 = tk.Frame(main_win, bg='green', height=150, width=350)
    frm2.grid(row=1, column=0, sticky='nsew')
    frm2.rowconfigure(0, weight=1)
    frm2.rowconfigure(1, weight=1)
    frm2.rowconfigure(2, weight=1)
    frm2.columnconfigure(0, weight=1)

    quit_btn = tk.Button(frm1, bg='lightgrey', text='Quit', command=main_win.destroy)
    quit_btn.grid(row=1)
    main_win.mainloop()


if __name__ == '__main__':
    main()

结果:

如您所见,我可以调整底部框架的大小,而不必垂直调整顶部框架的大小,现在两个框架都水平扩展。

enter image description here

相关问题