如何使用 .grid() 或 .pack() 将某些内容对齐到 Tkinter 的左下角?

1 python user-interface tkinter python-3.x

我目前正在尝试在 Tkinter 中制作一个使用多个不同窗口的游戏。
但是,当我尝试创建辅助窗口的布局时,我似乎无法将Return to Menu按钮置于列表框下方并左对齐。我已经尝试过使用.pack().grid()方法,但它们对我来说没有意义。

我尝试过使用.pack()

header = Frame(wn).pack()
title = Label(header, text='Single-Player',font=('Arial bold',20),bg=bgcolor).pack(anchor='center')
footer = Frame(wn).pack(side=BOTTOM)

return_to_menu = Button(footer, text='Return to Main Menu',font=('Arial',16),bg=bgcolor,command=lambda: menu()).pack(side=BOTTOM,padx=20,pady=250)

# body frame (left side)
bodyL = Frame(wn).pack(side=LEFT)

#output box
output = Listbox(bodyL, width=50, font=("Arial", 20)).pack(side=LEFT,padx=15)`
Run Code Online (Sandbox Code Playgroud)

我尝试过使用.grid()

header = Frame(wn).grid(sticky=N)
title = Label(header, text='Single-Player',font=('Arial bold',20),bg=bgcolor).grid(sticky=N+E+W,row=0,column=0)
footer = Frame(wn).grid(sticky=S)

return_to_menu = Button(footer, text='Return to Main Menu',font=('Arial',16),bg=bgcolor,command=lambda: menu()).grid(sticky=S,padx=20,row=0,column=0)

# body frame (left side)
bodyL = Frame(wn).grid(sticky=W)

#output box
output = Listbox(bodyL, width=50, font=("Arial", 20)).grid(sticky=W,padx=15, )`
Run Code Online (Sandbox Code Playgroud)

但是,使用.grid()不再将我的标题与屏幕中心对齐。
有没有一种方法可以更有效地将其居中 - 我不喜欢使用padx=450它来居中。
按钮和列表框发生的情况是按钮出现在列表框的左侧,而不是底部。我尝试了几种其他方法,例如增加行号,但我的脚本似乎没有达到我的预期。

Mik*_*SMT 9

下面是一个示例,说明如何设置特定列和行的权重以使小部件粘附到屏幕上的特定位置。

通过使用grid()我们需要使用columnconfigure()rowconfigure()使其发挥作用。

这两种方法用于定义当容器增大或缩小时,列或行相对于其周围的列或行将以什么比例扩展。

请参阅下面的示例,如果您有任何疑问,请告诉我:

import tkinter as tk


root = tk.Tk()

for i in range(3):
    root.columnconfigure(i, weight=1)

root.rowconfigure(1, weight=1)

tk.Label(root, text='Top left').grid(row=0, column=0, sticky='w')
tk.Label(root, text='Top center').grid(row=0, column=1)
tk.Label(root, text='Top right').grid(row=0, column=2, sticky='e')
tk.Label(root, text='center').grid(row=1, column=1)
tk.Label(root, text='Bottom left').grid(row=2, column=0, sticky='w')
tk.Label(root, text='Bottom center').grid(row=2, column=1)
tk.Label(root, text='Bottom right').grid(row=2, column=2, sticky='e')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

例子:

在此输入图像描述

这是另一个示例,但这次我在框架之外有一个标题标签,这样我们就可以更轻松地管理居中的标题,然后将框架的所有其他内容与标题标签分开。

import tkinter as tk

root = tk.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1)

frame = tk.Frame(root)
frame.grid(row=1, column=0, sticky='nsew')

for i in range(3):
    frame.columnconfigure(i, weight=1)

frame.rowconfigure(1, weight=1)

tk.Label(root, text='Title centered').grid(row=0, column=0)
tk.Label(frame, text='Top left').grid(row=0, column=0, sticky='w')
tk.Label(frame, text='Top center').grid(row=0, column=1)
tk.Label(frame, text='Top right').grid(row=0, column=2, sticky='e')
tk.Label(frame, text='Center').grid(row=1, column=1)
tk.Label(frame, text='Bottom left').grid(row=2, column=0, sticky='w')
tk.Label(frame, text='Bottom center').grid(row=2, column=1)
tk.Label(frame, text='Bottom right').grid(row=2, column=2, sticky='e')
tk.Label(root, text='Footer centered').grid(row=2, column=0)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

例子:

在此输入图像描述

为了解决评论中的问题,您不能grid()在创建容器的同一行上使用或任何其他几何管理器。这将始终导致该帧的变量None随着几何管理器None在调用时返回而返回。

请参阅此图片,了解当您在grid()创建容器的同一行上使用时会发生什么。

在此输入图像描述

现在,如果您删除grid()创建容器的行上的部分,然后将其写入下一行,如上图的注释部分所示,它将按预期工作。请参阅下图,了解容器中 grid() 的正确使用。

在此输入图像描述

要解决评论中的第二个问题,您可以添加此行以在左下角提供一个按钮。

tk.Button(root, text='Bottom left button').grid(row=3, column=0, sticky='w')
Run Code Online (Sandbox Code Playgroud)

例子:

在此输入图像描述