当我添加小部件时,Tkinter框架会调整大小

时间:2019-11-25 23:39:08

标签: python tkinter

我刚开始使用Tkinter,我面临一个奇怪的问题,基本上,我希望我的应用看起来像这样

enter image description here

因此,为了做到这一点,我创建了两个Frames,一个用于菜单项,另一个用于显示内容。奇怪的是,当我使用给定的宽度和高度初始化帧时,程序似乎按预期工作,但是当我将一些小部件放入窗口调整大小时,看起来像这样

enter image description here

有人可以向我解释这种奇怪的行为吗?我想念什么?另外,我想提到的是,当我将按钮添加到菜单框架时,宽度会更改为适合按钮的宽度,而不是我想要的反之亦然

app = tk.Tk()
app.resizable(False, False)

menu_frame_users = tk.Frame(app, width=200, background='red')
content_frame = tk.Frame(app, height=600, width=600, background='blue')


hello_label = tk.Label(menu_frame_users, text='Hello, User').grid(column=0, row=0, sticky='we')
view_profile_button = tk.Button(menu_frame_users, text="View Profile").grid(column=0, row=1, sticky='we')
invoices_button = tk.Button(menu_frame_users, text="Invoices").grid(column=0, row=2, sticky='we')
bookings_button = tk.Button(menu_frame_users, text="View bookings").grid(column=0, row=3, sticky='we')
tools_button = tk.Button(menu_frame_users, text="Search tools").grid(column=0, row=4, sticky='we')

test_label = tk.Label(content_frame, text='View profile')
test_label.grid(column=0, row=0, sticky='we')


menu_frame_users.grid(column=0, row=0, sticky='nswe')
content_frame.grid(column=1, row=0, sticky='nswe')

2 个答案:

答案 0 :(得分:1)

除非您增加行和列的权重以使其扩展,否则tkinter中的框架将仅与其中包含的小部件一样大。

您可以通过设置窗口的大小然后在适当的行和列上增加权重来使框架扩展。

    app.geometry('500x400')
    app.grid_columnconfigure(1, weight=1)
    app.grid_rowconfigure(0, weight=1)

您可以调整窗口的大小,然后调整按钮的大小和位置,直到获得所需的布局。

您还可以使用:

    app.grid_columnconfigure(1, minsize=300)

但是,仅当列包含窗口小部件时,此选项才适用。

答案 1 :(得分:1)

我不确定我是否完全理解这个问题,但这也许会有所帮助。注意为了示例,我删除了显式框架尺寸。

import tkinter as tk

app = tk.Tk()
app.resizable(False, False)

menu_frame_users = tk.Frame(app,background='red')
content_frame = tk.Frame(app, background='blue')

app.geometry("500x500")

app.rowconfigure(0, weight=1)
app.columnconfigure(0, weight=1)
menu_frame_users.columnconfigure(0, weight=1)

hello_label = tk.Label(menu_frame_users, text='Hello, User').grid(column=0, row=0, sticky='we')
view_profile_button = tk.Button(menu_frame_users, text="View Profile").grid(column=0, row=1, sticky='we')
invoices_button = tk.Button(menu_frame_users, text="Invoices").grid(column=0, row=2, sticky='we')
bookings_button = tk.Button(menu_frame_users, text="View bookings").grid(column=0, row=3, sticky='we')
tools_button = tk.Button(menu_frame_users, text="Search tools").grid(column=0, row=4, sticky='we')

test_label = tk.Label(content_frame, text='View profile')
test_label.grid(column=0, row=0, sticky='we', padx=20, pady=20)


menu_frame_users.grid(column=0, row=0, sticky='nswe')
content_frame.grid(column=1, row=0, sticky='nswe')

app.mainloop()

tkinter的文档有点有限,但是在this page.上有一些关于网格配置的好信息

通常来说,给定容器中的小部件是赋予容器尺寸的要素,除非另有明确编码。 (换句话说,框架会随着您向其中添加内容而增长,而不是相反)

在您的示例中,我添加了一个任意的窗口大小(您也可以在该字符串参数中指定一个偏移量)。我的猜测是您正在寻找rowconfigure()columnconfigure()。另外,您可以使用.grid()

添加一些填充来使内容变空

我几乎专门使用网格几何管理器,但是有时您可能会发现使用pack()place()更为实用,只是要确保不要同时使用两者。

干杯。