PySimpleGUI点击按钮复制窗口报TypeError错误求助
问题分析
报错TypeError: 'int' object is not iterable的核心原因是变量复用导致类型混乱:
- 初始时
n是整数类型的计数器(n=0) - 在
duplicate事件分支里,你把n重新赋值成了布局列表(n = [[sg.Text(...), ...]]) - 紧接着执行
n +=1,此时n是列表类型,试图给列表加整数,直接触发类型错误
此外代码还有两处逻辑漏洞:
- 点击
close或关闭窗口后,仅执行window.close()但循环未终止,后续window.read()会触发报错 duplicate分支的条件里包含sg.WIN_CLOSED完全多余,会导致窗口关闭时错误执行新建窗口的逻辑
修正后的代码
import PySimpleGUI as sg # 拆分变量:计数器和布局分开定义,避免类型冲突 window_count = 0 layout = [[sg.Text("Duplicate or close?")], [sg.Button("close")], [sg.Button("duplicate")]] # 创建第一个窗口 window = sg.Window(f"Demo {window_count}", layout) while True: event, values = window.read() # 处理当前窗口的关闭/close按钮事件 if event == "close" or event == sg.WIN_CLOSED: window.close() break # 处理新建窗口的逻辑 if event == "duplicate": window_count += 1 # 直接复用预先定义的layout创建新窗口 new_window = sg.Window(f"Demo {window_count}", layout) # 给新窗口单独绑定事件循环,避免干扰主窗口 while True: new_event, new_values = new_window.read() if new_event == "close" or new_event == sg.WIN_CLOSED: new_window.close() break
关键改动说明
- 变量拆分:用
window_count专门做窗口计数器,layout固定定义一次,彻底避免变量类型冲突 - 独立事件循环:每个新窗口单独维护自己的事件循环,关闭时仅终止自身循环并关闭窗口,不影响其他窗口
- 窗口命名区分:给每个窗口加上计数器后缀,方便直观区分不同窗口实例
内容的提问来源于stack exchange,提问作者GeliMorto
相关产品推荐
相关产品推荐

