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
错误原因
原循环逻辑存在两个问题:
- 当触发
WIN_CLOSED或“Отмени”时,仅关闭窗口但未退出循环,导致下一次循环继续调用password_window.read(),而窗口已关闭,反复触发错误直到达到100次上限。 - 函数没有明确的返回值,主程序无法判断验证是否通过,也无法正确处理窗口关闭的情况。
修复方案
修改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
相关产品推荐
相关产品推荐

