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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:54:03