
本文旨在帮助开发者在使用 PySimpleGUI 构建密码验证功能时,避免常见的“You have tried 100 times to read a closed window”错误。通过提供代码示例和详细解释,您将学会正确处理窗口关闭事件,确保程序的稳定性和用户体验。
在使用 PySimpleGUI 构建应用程序时,特别是涉及到模态窗口(例如密码验证窗口)时,正确处理窗口关闭事件至关重要。 常见的错误是尝试在窗口关闭后继续读取窗口数据,导致 "You have tried 100 times to read a closed window" 错误。本文将提供一个示例,演示如何避免此错误,并提供最佳实践。
问题分析
该错误通常发生在以下场景:
- 在一个循环中读取窗口事件和值。
- 当用户关闭窗口或点击取消按钮时,窗口被关闭。
- 循环没有正确退出,导致程序尝试再次读取已关闭的窗口。
解决方案
解决此问题的关键在于:
- 在窗口关闭后立即退出循环。
- 在循环外部关闭窗口。
以下是一个修改后的代码示例,展示了如何正确处理窗口关闭事件:
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("Confirm"),sg.Button("Delete")]
]
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 == "Delete" or event == sg.WIN_CLOSED:
break
if event == 'Confirm':
password_input_value = values['-PASSWORD-']
if verify_password(password_input_value):
break
else:
continue
password_window.close()
protect()代码解释:
- break 语句: 当用户点击 "Delete" 按钮或关闭窗口时(event == "Delete" or event == sg.WIN_CLOSED),break 语句用于退出 while 循环。
- password_window.close(): 在 while 循环结束后,password_window.close() 语句确保窗口被关闭。 将关闭窗口的操作放在循环外部可以确保在退出循环后只关闭一次窗口,避免了在循环内部多次关闭窗口的可能性。
最佳实践和注意事项
- 始终检查 sg.WIN_CLOSED 事件: 确保你的代码能正确处理窗口关闭事件。 这是避免 "读取已关闭窗口" 错误的关键。
- 在循环外部关闭窗口: 始终在事件循环结束后关闭窗口。 这样可以避免在循环内部多次关闭窗口的潜在问题。
- 使用 break 语句退出循环: 当满足退出条件时,使用 break 语句立即退出循环。
- 错误处理: 可以添加更完善的错误处理机制,例如使用 try...except 块来捕获潜在的异常。
总结
通过遵循以上建议,你可以避免在使用 PySimpleGUI 构建密码验证或其他需要模态窗口的应用程序时遇到 "读取已关闭窗口" 错误。 确保你的代码能正确处理窗口关闭事件,并在循环外部关闭窗口,以确保程序的稳定性和用户体验。










