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

PySimpleGUI报错‘Unable to complete operation on element with key None’求助

PySimpleGUI猜数字程序错误修复

存在的问题及修复方式:

  • 导入语句错误:import randomimport PySimpleGUI as sg 将两个库的导入语句连写,需拆分为两行:
    import random
    import PySimpleGUI as sg
    
  • 构造函数命名错误:类的初始化方法应为__init__(前后各两个下划线),原代码中init少了下划线,导致类属性未正确初始化。
  • 类方法缩进错误:GerarNumeroAleatorio方法属于类的成员方法,需缩进至类内部,原代码中该方法在类外部,无法访问类的实例属性。
  • 窗口创建参数错误:创建窗口时参数名应为小写的layout,原代码中Layout=layout会被识别为自定义元素key,导致布局加载失败,这是触发Unable to complete operation on element with key None错误的核心原因。
  • 主循环逻辑冗余:内层while self.tentar_novamente == True循环无必要,外层已为主循环,每次点击按钮只需判断一次猜测结果即可。
  • 未处理窗口关闭事件:当用户点击窗口关闭按钮时,event会返回None,需在主循环中处理该情况以退出程序,避免报错。
  • 异常处理范围过宽:原代码用except:捕获所有异常,应改为捕获特定异常(如ValueError,即输入非数字时的异常),避免掩盖其他未知错误。

修复后的完整代码:

import random
import PySimpleGUI as sg

class ChuteONumero:
    def __init__(self):
        self.valor_aleatorio = 0
        self.valor_minimo = 1
        self.valor_maximo = 100
        self.tentar_novamente = True

    def GerarNumeroAleatorio(self):
        self.valor_aleatorio = random.randint(
            self.valor_minimo, self.valor_maximo)

    def Iniciar(self):
        # Layout
        layout = [
            [sg.Text('Seu chute', size=(39, 0))],
            [sg.Input(size=(18, 0), key='ValorChute')],
            [sg.Button('Chutar!')],
            [sg.Output(size=(39, 10))]
        ]
        # Criar uma janela
        self.janela = sg.Window('Chute o numero!', layout=layout)
        self.GerarNumeroAleatorio()

        while True:
            # Receber valores
            self.evento, self.valores = self.janela.read()
            # 处理窗口关闭事件
            if self.evento is None:
                break
            # Fazer alguma coisa com os valores
            if self.evento == 'Chutar!':
                try:
                    self.valor_do_chute = int(self.valores['ValorChute'])
                    if self.valor_do_chute > self.valor_aleatorio:
                        print('Chute um valor mais baixo')
                    elif self.valor_do_chute < self.valor_aleatorio:
                        print('Chute um valor mais alto!')
                    else:
                        self.tentar_novamente = False
                        print('Parabéns, você acertou!')
                except ValueError:
                    print('Não foi compreendido, apenas digite numeros de 1 a 100')
        
        self.janela.close()

chute = ChuteONumero()
chute.Iniciar()

内容的提问来源于stack exchange,提问作者Lenin Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:40:27