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

时间:2019-12-30 19:35:18

标签: python python-3.x user-interface tkinter

我目前正在尝试在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使其居中。
按钮和列表框的作用是,按钮显示在列表框的左侧,而不是底部。我尝试了其他几种方法,例如增加行号,但是我的脚本似乎没有达到我的预期。

1 个答案:

答案 0 :(得分:0)

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

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