You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不借助辅助组件,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:31:22