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

PySimpleGUI点击按钮复制窗口报TypeError错误求助

问题分析

报错TypeError: 'int' object is not iterable的核心原因是变量复用导致类型混乱:

  • 初始时n是整数类型的计数器(n=0)
  • 在duplicate事件分支里,你把n重新赋值成了布局列表(n = [[sg.Text(...), ...]])
  • 紧接着执行n +=1,此时n是列表类型,试图给列表加整数,直接触发类型错误

此外代码还有两处逻辑漏洞:

  1. 点击close或关闭窗口后,仅执行window.close()但循环未终止,后续window.read()会触发报错
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:09