0

状況

パスワードマネージャーとして機能する完全なアプリケーションを作成しました。ファイルに保存されているマスターパスワードがあります。ユーザーが主要な操作 (アカウントの変更、新しいアカウントの作成、マスター パスワードの変更など) を実行するたびに、ユーザーにマスター パスワードの入力を求め、ファイルに保存されている内容でどのユーザーが入力したかを確認します。このために、関数を次のように定義しました。

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

これは私がやりたいことです:

  1. ユーザーにパスワードを尋ねる
  2. COユーザーが入力した内容とファイルに保存されている内容を比較します。

    i) それらが一致する場合、関数が呼び出された場所に戻り、さらにステートメントを実行します。

    ii) 一致しない場合は、ウィンドウに何かを表示してから終了します。制御は、関数が呼び出された場所に戻るべきではありません。

編集 2

これは私が得たものです:

    if not temp == M:

        self.window.destroy()

        import sys
        sys.exit()

しかし、これには問題があります。これですべてが削除され、問題ありません。実際、それはまさに私が欲しいものです。しかし、すべてを終了する前に、ラベルを印刷してから終了したいと思いますunauthorized access。そう:

  1. ラベルを印刷する
  2. 3 秒間待ちます
  3. 窓を破壊する
  4. を使用してアプリケーションを終了しますsys.exit()

現在のコードはステップ 3 とステップ 4 の両方を実行できますが、ステップ 1 と 2 は重要なステップであり、他の 2 つより先に実行する必要があります。

すでに使用してみself.window.after(3000,sys.exit)ましたが、これは機能しません。3 秒後に終了しますが、コントロールは呼び出し元の場所に戻り、そこでcheckpointステートメントが実行されます。

この問題に対処し、同じ解決策を提供してください。

4

0 に答える 0