状況
パスワードマネージャーとして機能する完全なアプリケーションを作成しました。ファイルに保存されているマスターパスワードがあります。ユーザーが主要な操作 (アカウントの変更、新しいアカウントの作成、マスター パスワードの変更など) を実行するたびに、ユーザーにマスター パスワードの入力を求め、ファイルに保存されている内容でどのユーザーが入力したかを確認します。このために、関数を次のように定義しました。
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 では非常に難しいことが証明されています。既存の関数を再構築してプログラム全体を変更したくありません。そのため、 function でのみ行う必要がある変更を含む方法を提案してくださいself.checkpoint
。
編集 1
これは私がやりたいことです:
- ユーザーにパスワードを尋ねる
COユーザーが入力した内容とファイルに保存されている内容を比較します。
i) それらが一致する場合、関数が呼び出された場所に戻り、さらにステートメントを実行します。
ii) 一致しない場合は、ウィンドウに何かを表示してから終了します。制御は、関数が呼び出された場所に戻るべきではありません。
編集 2
これは私が得たものです:
if not temp == M:
self.window.destroy()
import sys
sys.exit()
しかし、これには問題があります。これですべてが削除され、問題ありません。実際、それはまさに私が欲しいものです。しかし、すべてを終了する前に、ラベルを印刷してから終了したいと思いますunauthorized access
。そう:
- ラベルを印刷する
- 3 秒間待ちます
- 窓を破壊する
- を使用してアプリケーションを終了します
sys.exit()
現在のコードはステップ 3 とステップ 4 の両方を実行できますが、ステップ 1 と 2 は重要なステップであり、他の 2 つより先に実行する必要があります。
すでに使用してみself.window.after(3000,sys.exit)
ましたが、これは機能しません。3 秒後に終了しますが、コントロールは呼び出し元の場所に戻り、そこでcheckpoint
ステートメントが実行されます。
この問題に対処し、同じ解決策を提供してください。