如何使用.grid()或.pack()将某个对象与Tkinter中的左下角对齐?

2024-04-20 13:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用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)`

我试过使用.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, )`

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


Tags: totextframesidepackgridheaderbg
1条回答
网友
1楼 · 发布于 2024-04-20 13:36:18

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

使用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()

示例:

enter image description here

这里是另一个例子,但这次我有一个框架外的标题标签,这样我们可以更容易地管理标题居中,然后与框架的所有其他内容的工作是分开的标题标签。你知道吗

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()

示例:

enter image description here

要解决注释中的问题,不能在创建容器的同一行上使用grid()或任何其他几何体管理器。这将始终导致该帧的变量返回None,因为几何体管理器在调用时返回None。你知道吗

在创建容器的同一行上使用grid()时会发生什么,请参见此图。你知道吗

enter image description here

现在,如果删除创建容器的行上的grid()部分,然后将其写入下一行,正如上面图像的注释掉部分所示,它将按预期工作。如下图所示,正确使用容器的grid()。你知道吗

enter image description here

要解决评论中的第二个问题,可以在左下角添加一个按钮。你知道吗

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

示例:

enter image description here

相关问题 更多 >