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

PySimpleGUI实现不同按钮打开对应独立窗口的问题求助

问题修复方案

你的代码存在三个核心问题导致Statistics按钮功能失效:

  • 主窗口中Statistics按钮的key设为"stat",但主循环里判断的是event == "Statistics",两者不匹配,触发逻辑不会执行
  • 子窗口函数stats_window()里,循环读取的是主窗口的事件而非子窗口自身的事件,导致子窗口无法响应关闭或提交操作
  • 子窗口函数最后错误关闭了主窗口,而非子窗口本身

修复后的完整代码:

import PySimpleGUI as sg

layout = [
        [sg.Text("Welcome, please select the subject.")],
        [sg.Button("Statistics", key="stat"), sg.Button("Computer Science", key="cs"),
        sg.Button("Mathematics", key="math"), sg.Button("Physics", key="phy"),
        sg.Button("Electronics", key="ele"), sg.Button("Chemistry", key="chem")]]

window = sg.Window("Basic details", layout)

def stats_window():
    layout_s = [[sg.Text("Enter Full Name :"), sg.InputText(key="name")],
                 [sg.Text("Select Subject"), sg.Combo(["Statistics", "Computer Science", "Mathematics", "Electronics",
                                                       "Physics", "Chemistry"], key="subject")],
                 [sg.Text("Enter Enrollment No. :"), sg.InputText(key="rollno")],
                 [sg.Text("Medium :"), sg.InputText(key="med")],
                 [sg.Text("Gender"), sg.Combo(["Male", "Female"], key="gender")],
                 [sg.Button("Submit", key="submit")]
                ]
    # 创建子窗口对象
    sub_window = sg.Window("Statistics", layout_s, modal=True)
    while True:
        # 读取子窗口的事件和值
        event, values = sub_window.read()
        if event == sg.WINDOW_CLOSED or event == "submit":
            # 处理提交逻辑(这里可以添加数据保存等操作)
            if event == "submit":
                print("提交的数据:", values)
            break
    # 关闭子窗口
    sub_window.close()


while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED:
        break
    # 匹配按钮的key值"stat"
    elif event == "stat":
        stats_window()

window.close()

额外优化建议

如果要给所有科目按钮实现类似功能,可以编写一个通用的子窗口生成函数,避免重复代码:

def create_subject_window(subject_name):
    layout = [[sg.Text("Enter Full Name :"), sg.InputText(key="name")],
              [sg.Text("Select Subject"), sg.Combo(["Statistics", "Computer Science", "Mathematics", "Electronics",
                                                    "Physics", "Chemistry"], default_value=subject_name, key="subject")],
              [sg.Text("Enter Enrollment No. :"), sg.InputText(key="rollno")],
              [sg.Text("Medium :"), sg.InputText(key="med")],
              [sg.Text("Gender"), sg.Combo(["Male", "Female"], key="gender")],
              [sg.Button("Submit", key="submit")]
             ]
    sub_window = sg.Window(subject_name, layout, modal=True)
    while True:
        event, values = sub_window.read()
        if event == sg.WINDOW_CLOSED or event == "submit":
            if event == "submit":
                print(f"{subject_name}提交数据:", values)
            break
    sub_window.close()

# 主循环里可以统一处理所有科目按钮
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED:
        break
    # 根据按钮key映射科目名称
    subject_map = {
        "stat": "Statistics",
        "cs": "Computer Science",
        "math": "Mathematics",
        "phy": "Physics",
        "ele": "Electronics",
        "chem": "Chemistry"
    }
    if event in subject_map:
        create_subject_window(subject_map[event])

内容的提问来源于stack exchange,提问作者Pranav Khilnani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:11:53