メインプログラムを閉じて再開するのと同じことをしたいだけです。ドロップダウンメニューの「新規」のようなオプションがクリックされたときに呼び出したい。root.destroy()を呼び出してから、メインループを再開するようなものです。
どうすればこれを行うことができますか?
これを解決するには、少なくとも 3 つの方法があります。
方法 1:頭の偽物。アプリを作成するときは、すべてのウィジェットをルート ウィンドウに配置しないでください。代わりに、ルート ウィンドウを非表示にして、アプリケーションを表す新しいトップレベルを作成します。再起動するときは、その新しいトップレベルを破棄して、すべての起動ロジックを再実行するだけです。
方法 2: nuke と pave。コンセプトは似ていますが、実行方法が少し異なります。このモデルでは、再起動したい場合は、メイン ウィンドウ内のすべてのウィジェットを削除し、ジオメトリを null にリセットして (そのため、ウィンドウはその内容に基づいて再度サイズ変更されます)、他のすべてのウィジェットを描画するロジックを実行します。 .
方法 3:最初に機能した場合... Martin v. Löwis が提案したように、単にプログラムを実行してプログラムの新しいインスタンスを実行し、終了します。
最初の 2 つの方法は潜在的に高速であり、現在の環境を維持するという (欠点?) 利点があります。たとえば、クリップボード、列幅などのコピーを保存できます。3 番目の方法では、白紙の状態が確実に保証されます。
Unix を使用している場合は、アプリケーション全体を os.execv で再起動します。すべてのコマンドライン引数などを渡すようにしてください。
すべての GUI 構築ロジックと初期状態コードをメインループから取り出して、関数に入れることができます。これらの関数をメインループから呼び出し (buildgui() & initstate() のようなもの)、ユーザーがメニュー アイコンをクリックしたときに initstate() を呼び出すだけで、アプリケーションが最初に起動したときの状態に戻ります。