如何不借助辅助组件,用pack或grid居中Tkinter的frm_login?
Tkinter中无需额外组件实现frm_login居中(pack/grid方法)
完全可行,不用额外辅助组件就能通过pack或grid实现frm_login在主窗口中水平垂直居中。你之前尝试的anchor="center"没生效,是因为设置了side="left"——这个参数会强制框架靠左排列,anchor只能在靠左的基础上调整垂直方向的对齐,无法改变水平位置。
以下是两种实现方式:
方法一:使用pack布局
只需修改frm_login的pack参数,去掉side="left",添加expand=True即可:
frm_login = ttk.Frame(principal) # expand=True让父窗口将额外空间分配给组件四周,从而实现居中 frm_login.pack(expand=True)
完整代码示例:
import tkinter as tk from tkinter import ttk principal = tk.Tk() principal.title("Login") principal.resizable(False, False) largura = 300 altura = 200 posx = int(principal.winfo_screenwidth() / 2 - largura / 2) posy = int(principal.winfo_screenheight() / 2 - altura / 1.2) principal.geometry("{0}x{1}+{2}+{3}".format(largura, altura, posx, posy)) frm_login = ttk.Frame(principal) frm_login.pack(expand=True) lb_usuario = ttk.Label(frm_login, text="Usuário") lb_usuario.grid(row=0, column=0, padx=5, pady=5, sticky="e") ed_usuario = ttk.Entry(frm_login, width=24) ed_usuario.grid(row=0, column=1, sticky="w") lb_senha = ttk.Label(frm_login, text="Senha") lb_senha.grid(row=1, column=0, padx=5, pady=5, sticky="e") ed_senha = ttk.Entry(frm_login, width=24) ed_senha.grid(row=1, column=1, sticky="w") frm_botoes = ttk.Frame(frm_login) frm_botoes.grid(row=2, column=1, pady=5, sticky="w") bt_entrar = ttk.Button(frm_botoes, text="Entrar") bt_entrar.grid(row=1, column=1) bt_sair = ttk.Button(frm_botoes, text="Sair") bt_sair.grid(row=1, column=2) principal.mainloop()
方法二:使用grid布局
先配置主窗口的grid行和列权重,让其占据所有可用空间,再将frm_login放在单元格中并设置anchor="center":
# 主窗口配置:让第0行和第0列占据所有可用空间 principal.rowconfigure(0, weight=1) principal.columnconfigure(0, weight=1) frm_login = ttk.Frame(principal) # anchor="center"让组件在单元格内居中 frm_login.grid(row=0, column=0, anchor="center")
完整代码示例:
import tkinter as tk from tkinter import ttk principal = tk.Tk() principal.title("Login") principal.resizable(False, False) largura = 300 altura = 200 posx = int(principal.winfo_screenwidth() / 2 - largura / 2) posy = int(principal.winfo_screenheight() / 2 - altura / 1.2) principal.geometry("{0}x{1}+{2}+{3}".format(largura, altura, posx, posy)) # 配置主窗口grid布局的行和列权重 principal.rowconfigure(0, weight=1) principal.columnconfigure(0, weight=1) frm_login = ttk.Frame(principal) frm_login.grid(row=0, column=0, anchor="center") lb_usuario = ttk.Label(frm_login, text="Usuário") lb_usuario.grid(row=0, column=0, padx=5, pady=5, sticky="e") ed_usuario = ttk.Entry(frm_login, width=24) ed_usuario.grid(row=0, column=1, sticky="w") lb_senha = ttk.Label(frm_login, text="Senha") lb_senha.grid(row=1, column=0, padx=5, pady=5, sticky="e") ed_senha = ttk.Entry(frm_login, width=24) ed_senha.grid(row=1, column=1, sticky="w") frm_botoes = ttk.Frame(frm_login) frm_botoes.grid(row=2, column=1, pady=5, sticky="w") bt_entrar = ttk.Button(frm_botoes, text="Entrar") bt_entrar.grid(row=1, column=1) bt_sair = ttk.Button(frm_botoes, text="Sair") bt_sair.grid(row=1, column=2) principal.mainloop()
内容的提问来源于stack exchange,提问作者RicardoRocha
相关产品推荐
相关产品推荐

