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
相关产品推荐
相关产品推荐

