tkinter第二个窗口使用grid创建表单及添加菜单栏相关问题
Tkinter第二窗口常见问题解决方案
Tkinter的第二窗口通常通过Toplevel类实现,其布局、组件挂载逻辑和主窗口Tk基本一致,两个问题的具体实现方法如下:
1. 第二个窗口使用grid布局创建表单
直接将第二窗口(Toplevel实例)作为组件的父容器,调用组件的grid()方法按行列排布即可实现表单布局,可运行示例如下:
import tkinter as tk from tkinter import ttk # 初始化主窗口 root = tk.Tk() root.title("主窗口") def open_form_window(): # 创建第二窗口 form_win = tk.Toplevel(root) form_win.title("用户信息表单") form_win.geometry("420x280") # grid布局排布表单项 # 用户名行 ttk.Label(form_win, text="用户名:").grid(row=0, column=0, padx=15, pady=12, sticky="w") username_input = ttk.Entry(form_win) username_input.grid(row=0, column=1, padx=15, pady=12, sticky="ew") # 手机号行 ttk.Label(form_win, text="手机号:").grid(row=1, column=0, padx=15, pady=12, sticky="w") phone_input = ttk.Entry(form_win) phone_input.grid(row=1, column=1, padx=15, pady=12, sticky="ew") # 居住地址行 ttk.Label(form_win, text="居住地址:").grid(row=2, column=0, padx=15, pady=12, sticky="w") address_input = ttk.Entry(form_win) address_input.grid(row=2, column=1, padx=15, pady=12, sticky="ew") # 提交按钮行 submit_btn = ttk.Button(form_win, text="提交表单", command=lambda: print("表单已提交")) submit_btn.grid(row=3, column=0, columnspan=2, pady=20) # 配置输入框列自适应窗口宽度 form_win.grid_columnconfigure(1, weight=1) # 主窗口入口按钮 open_btn = ttk.Button(root, text="打开表单窗口", command=open_form_window) open_btn.pack(padx=60, pady=60) root.mainloop()
核心注意点:
row和column参数对应组件的行列索引,从0开始计数sticky参数控制组件在单元格内的对齐方式,w为靠左对齐,ew为横向填满单元格- 调用
grid_columnconfigure给列设置weight=1,可以实现窗口缩放时对应列自动拉伸适配
2. 第二个窗口创建菜单栏
第二窗口创建菜单栏的逻辑和主窗口完全一致,将菜单栏的父组件指定为对应Toplevel实例,再调用窗口的config(menu=xxx)绑定即可,可运行示例如下:
def open_menu_window(): menu_win = tk.Toplevel(root) menu_win.title("带菜单栏的第二窗口") menu_win.geometry("400x300") # 创建顶层菜单栏,父组件为第二窗口 top_menubar = tk.Menu(menu_win) # 文件子菜单 file_menu = tk.Menu(top_menubar, tearoff=0) file_menu.add_command(label="新建项目", command=lambda: print("新建项目")) file_menu.add_command(label="导出数据", command=lambda: print("导出数据")) file_menu.add_separator() file_menu.add_command(label="关闭窗口", command=menu_win.destroy) top_menubar.add_cascade(label="文件", menu=file_menu) # 视图子菜单 view_menu = tk.Menu(top_menubar, tearoff=0) view_menu.add_command(label="放大窗口", command=lambda: menu_win.geometry("600x450")) view_menu.add_command(label="缩小窗口", command=lambda: menu_win.geometry("400x300")) top_menubar.add_cascade(label="视图", menu=view_menu) # 给第二窗口绑定菜单栏 menu_win.config(menu=top_menubar) # 主窗口添加打开按钮即可调用 open_menu_btn = ttk.Button(root, text="打开带菜单的窗口", command=open_menu_window) open_menu_btn.pack(padx=60, pady=20)
核心注意点:
- 子菜单的
tearoff=0参数用来关闭默认的菜单可分离拖拽功能,符合常规桌面软件的交互习惯 - 菜单栏的父组件必须指定为对应第二窗口,不能使用主窗口作为父组件,否则菜单会错误显示在主窗口顶部
内容的提问来源于stack exchange,提问作者shivanchal asthana
相关产品推荐
相关产品推荐

