情况
我编写了一个完整的应用程序作为密码管理器。我有一个存储在文件中的主密码。每次用户想要执行主要操作(如更改帐户、创建新帐户、更改主密码等)时,我都会提示用户输入主密码并验证用户输入的内容与文件中存储的内容。为此,我已经定义了一个函数:
def checkpoint(self):
##first take the masterKey from the file
inFile = open(FILE_NAME_Mast,'r')
M = inFile.read()
inFile.close()
temp = tkSimpleDialog.askstring('master key','Enter your master key:',show='*')
temp = temp + salt
temp = sha1(temp)
temp = temp.hexdigest()
if not temp == M:
self.quitwin()
else:
return
self.quitwin()
是在退出应用程序之前将在屏幕上显示愉快的功能。
问题
对于输入新账户、修改现有账户等流程,我所做的就是创建一个Toplevel
实例。在执行此操作时,我Tk
使用root.withdraw
. 所以发生的事情是,我在退出之前在屏幕上显示的任何内容都被隐藏了,即使用户输入了错误的主密码,用户也可以输入新帐户并将其存储到文件中。这是我绝对不想要的。
目标
一旦函数self.checkpoint
被调用,消息将显示一段时间,然后应用程序应该退出关闭所有窗口。基本上,我不希望控件返回调用 self.checkpoint 的函数,因为这会破坏主密钥的目的。
较早的
早些时候,我曾经使用 C++ 进行编程。从应用程序中退出非常简单。我使用了以下C++代码:
cout<<"\n\nEnter the master key:";
char str[50];
char masterKey[20];
//masterkey is read from file and stored into this variable.
for(int i =0;str[i]!=13;i++) // 13 is the ASCII code of the return key
{
str[i] = getch();
cout<<"*"; //so that an asterisk is displayed for each character.
}
if(strcmp(str,masterKey) != 0)
{
cout<<"\nWrong password";
cout<<"\nGoodbye.";
delay(2000); // included dos.h
exit(0); //included stdlib.h
}
但这在 Python 和 Tkinter 中被证明是相当困难的。我不想通过重构现有功能来改变整个程序。所以请建议一种方法,其中包括只需要在函数中进行的更改self.checkpoint
。
编辑 1
这就是我想做的:
- 询问用户密码
将用户输入的内容与文件中存储的内容进行比较:
i) 如果它们匹配,则返回调用函数的位置并执行进一步的语句。
ii) 如果它们不匹配,在窗口上显示一些东西然后退出。控制不应转移回调用函数的位置。
编辑 2
这就是我得到的:
if not temp == M:
self.window.destroy()
import sys
sys.exit()
但这有一个问题。这会删除所有内容,这很好。事实上,这正是我想要的。但在退出一切之前,我想打印一个标签unauthorized access
,然后退出。所以:
- 打印标签
- 等待 3 秒
- 摧毁窗户
- 使用退出应用程序
sys.exit()
本代码可以同时执行第 3 步和第 4 步,但第 1 步和第 2 步是重要的,需要在其他两个之前执行。
我已经尝试过使用self.window.after(3000,sys.exit)
,但这不起作用。三秒钟后它确实退出了,但控制返回到checkpoint
调用的地方并执行那里的语句。
请帮我解决这个问题并提供解决方案。