如何使用 tkinter 对齐网格中的小部件?
How to align widgets in a grid with tkinter?
我试图将 window 中心的标签与其下方的两个按钮对齐,也居中。我一直在谷歌上搜索并在这里寻找解决方法,我发现网格很有用,但它没有达到我的预期。如果我将每个小部件放在不同的行和列中,它会像我预期的那样工作,但如果我将它们放在不同的行和同一列中,它们只会保持左对齐。我在网格上做错了什么?此外,如有任何关于如何改进代码的建议,我们将不胜感激。
我省略了 LoadedMachine 和 CreateMachine 类 因为我觉得不需要它们。如果它们有帮助,我可以编辑问题以添加它们。
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side='top', fill='both', expand=True)
self.frames = {}
for F in (StartPage, LoadedMachine, CreateMachine):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0)
frame.config(bg='white')
self.show_frame('StartPage')
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.rowconfigure(2, weight=1)
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
welcome_label = tk.Label(self, text='Welcome', bg='green', fg='white', font=('Verdana', 80))
welcome_label.grid(row=0, column=1)
loadButton = tk.Button(self, text='Load an existing state machine', command=lambda: controller.show_frame('LoadedMachine'))
loadButton.config(highlightbackground='green', font=('Verdana', 18))
loadButton.grid(row=1, column=1)
createButton = tk.Button(self, text='Create a new state machine', command=lambda: controller.show_frame('CreateMachine'))
createButton.config(highlightbackground='green', font=('Verdana', 18))
createButton.grid(row=2, column=1)
if __name__ == '__main__':
app = App()
app.title('Cognitive State Machine')
app.geometry('800x600')
app.mainloop()
这是我得到的:
我希望按钮靠得更近,更靠近标签。
向网格添加填充以按您想要的方式对齐
你可以根据需要添加padx或者pady
loadButton.grid(row=1, column=1, padx=10, pady=20)
Helpfull link to further play with grid layout
另外,您可以使用 'partial' 而不是 'lambda',因为我们需要从命令函数调用该函数并在那里定义它。
一个建议是在创建框架时首先添加一些背景颜色以进行故障排除。
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self,bg="yellow")
container.pack(side='top', fill='both', expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
...
当你 运行 这样做时,你会看到一堆黄色,这意味着你的 StartPage
框架没有填满 space。所以你需要改变它:
for F in (StartPage,):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0,column=0,sticky="nesw")
frame.config(bg='green')
现在您可以看到您的背景变为绿色,这意味着您的 StartPage
框架正确缩放。最后你可以处理你的标签了:
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.columnconfigure(0, weight=1)
...
关于为什么需要为列添加权重,有一个很好的 post 。
我试图将 window 中心的标签与其下方的两个按钮对齐,也居中。我一直在谷歌上搜索并在这里寻找解决方法,我发现网格很有用,但它没有达到我的预期。如果我将每个小部件放在不同的行和列中,它会像我预期的那样工作,但如果我将它们放在不同的行和同一列中,它们只会保持左对齐。我在网格上做错了什么?此外,如有任何关于如何改进代码的建议,我们将不胜感激。
我省略了 LoadedMachine 和 CreateMachine 类 因为我觉得不需要它们。如果它们有帮助,我可以编辑问题以添加它们。
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side='top', fill='both', expand=True)
self.frames = {}
for F in (StartPage, LoadedMachine, CreateMachine):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0)
frame.config(bg='white')
self.show_frame('StartPage')
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.rowconfigure(2, weight=1)
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
welcome_label = tk.Label(self, text='Welcome', bg='green', fg='white', font=('Verdana', 80))
welcome_label.grid(row=0, column=1)
loadButton = tk.Button(self, text='Load an existing state machine', command=lambda: controller.show_frame('LoadedMachine'))
loadButton.config(highlightbackground='green', font=('Verdana', 18))
loadButton.grid(row=1, column=1)
createButton = tk.Button(self, text='Create a new state machine', command=lambda: controller.show_frame('CreateMachine'))
createButton.config(highlightbackground='green', font=('Verdana', 18))
createButton.grid(row=2, column=1)
if __name__ == '__main__':
app = App()
app.title('Cognitive State Machine')
app.geometry('800x600')
app.mainloop()
这是我得到的:
我希望按钮靠得更近,更靠近标签。
向网格添加填充以按您想要的方式对齐
你可以根据需要添加padx或者pady
loadButton.grid(row=1, column=1, padx=10, pady=20)
Helpfull link to further play with grid layout
另外,您可以使用 'partial' 而不是 'lambda',因为我们需要从命令函数调用该函数并在那里定义它。
一个建议是在创建框架时首先添加一些背景颜色以进行故障排除。
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self,bg="yellow")
container.pack(side='top', fill='both', expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
...
当你 运行 这样做时,你会看到一堆黄色,这意味着你的 StartPage
框架没有填满 space。所以你需要改变它:
for F in (StartPage,):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0,column=0,sticky="nesw")
frame.config(bg='green')
现在您可以看到您的背景变为绿色,这意味着您的 StartPage
框架正确缩放。最后你可以处理你的标签了:
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.columnconfigure(0, weight=1)
...
关于为什么需要为列添加权重,有一个很好的 post