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

PySimpleGui密码窗口报错:读取已关闭窗口问题修复求助

问题:PySimpleGUI密码验证窗口关闭后报错的修复

我用PySimpleGUI开发小型数据库程序,给“delete”按钮添加了管理员密码验证模块。点击“delete”弹出密码窗口后,如果直接关闭窗口(不点击确认或取消),会触发报错:您尝试读取已关闭窗口达100次,需添加event == WIN_CLOSED检查,错误出现在第22行event, values = password_window.read()。

原代码

import PySimpleGUI as sg
import hashlib

def protect():
        layout = [
                [sg.Text('Въведете парола:', size=(20, 1)), sg.InputText('', key='-PASSWORD-', password_char='*', size=(20, 1))],
                [sg.Button("Потвърди"),sg.Button("Отмени")]
                ]

        password_window = sg.Window('Функция изискваща достъп на управител', layout, modal=True)

        def verify_password(password):
                hash = '112e3f234c4d002cewc328e0be632rf34fer7181csf940b25c79d7bttrh3598ce12'
                password_utf = password.encode('utf-8')
                password_hash = hashlib.sha256(password_utf).hexdigest()
                print(password_hash)
                if hash == password_hash:
                        return True
                return False
        
        while True:
                event, values = password_window.read()
                if event == "Отмени" or event == sg.WIN_CLOSED:
                        password_window.close()
                        
                if event == 'Потвърди':
                        password_input_value = values['-PASSWORD-']
                        if verify_password(password_input_value):
                                break
                        else:
                                continue

我曾尝试修改循环逻辑,但修改后会直接跳过密码窗口返回主程序,不符合需求:

while True:
    event, values = password_window.read()
    if event == "Отмени" or event == sg.WIN_CLOSED:
            password_window.close()
                 else:
                    continue

错误原因

原循环逻辑存在两个问题:

  1. 当触发WIN_CLOSED或“Отмени”时,仅关闭窗口但未退出循环,导致下一次循环继续调用password_window.read(),而窗口已关闭,反复触发错误直到达到100次上限。
  2. 函数没有明确的返回值,主程序无法判断验证是否通过,也无法正确处理窗口关闭的情况。

修复方案

修改protect()函数的循环逻辑,在关闭窗口后立即退出循环并返回验证结果(布尔值),主程序根据返回值决定是否执行删除操作。

修复后的完整代码

import PySimpleGUI as sg
import hashlib

def protect():
    layout = [
        [sg.Text('Въведете парола:', size=(20, 1)), sg.InputText('', key='-PASSWORD-', password_char='*', size=(20, 1))],
        [sg.Button("Потвърди"), sg.Button("Отмени")]
    ]

    password_window = sg.Window('Функция изискваща достъп на управител', layout, modal=True)

    def verify_password(password):
        # 注意:实际项目中不要硬编码哈希值,建议从安全配置文件读取
        hash = '112e3f234c4d002cewc328e0be632rf34fer7181csf940b25c79d7bttrh3598ce12'
        password_utf = password.encode('utf-8')
        password_hash = hashlib.sha256(password_utf).hexdigest()
        print(password_hash)
        return hash == password_hash
    
    while True:
        event, values = password_window.read()
        # 处理窗口关闭或取消按钮:关闭窗口并返回验证失败
        if event == "Отмени" or event == sg.WIN_CLOSED:
            password_window.close()
            return False
        # 处理确认按钮
        if event == 'Потвърди':
            password_input_value = values['-PASSWORD-']
            if verify_password(password_input_value):
                password_window.close()
                return True  # 验证通过,返回True
            else:
                sg.popup("Невярна парола!")  # 提示错误密码,继续循环

# 主程序调用示例(替换为你的数据库主窗口逻辑)
if __name__ == "__main__":
    main_layout = [[sg.Button("delete")]]
    main_window = sg.Window("数据库程序", main_layout)
    
    while True:
        event, values = main_window.read()
        if event == sg.WIN_CLOSED:
            break
        if event == "delete":
            # 调用密码验证模块
            if protect():
                sg.popup("执行删除操作...")
                # 在这里编写你的数据库删除逻辑
            else:
                sg.popup("未通过管理员验证,取消删除")
    
    main_window.close()

关键修复点

  • 处理WIN_CLOSED或取消按钮时,关闭窗口后直接return False,既退出循环又告知主程序验证未通过
  • 验证通过时关闭窗口并return True,主程序据此执行删除操作
  • 添加错误密码的弹窗提示,提升用户体验
  • 主程序通过判断protect()的返回值,实现验证与业务逻辑的解耦

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:53:11