0

ボタンをクリックすると別のpythonスクリプトが開き、それ自体を閉じ、2番目のスクリプトのいくつかの戻り関数が元のスクリプトに戻るpythonスクリプトを作成しようとしています。

ありがとう。

4

1 に答える 1

3

あなたの質問は非常に漠然としているので、やや漠然とした答えがあります:

まず、本当にこれを行う必要があるかどうかを考えてください。最初のスクリプトimportが 2 番目のスクリプトをモジュールとして、その上で何らかの関数を呼び出すことができないのはなぜですか?

しかし、それに対する適切な答えが得られたと仮定しましょう。実際には、他のスクリプトを「閉じて」実行する必要があります。「閉じる」とは、「GUI を非表示にする」ことを意味します。

def handle_button_click(button):
    button.parent_window().hide()
    subprocess.call([sys.executable, '/path/to/other/script.py'])
    button.parent_window().show()

これにより、ウィンドウが非表示になり、他のスクリプトが実行され、他のスクリプトが終了するとウィンドウが再び表示されます。一般に、イベント ハンドラーの途中で何かを遅くしてブロックすることは非常に悪い考えですが、この場合はとにかく UI 全体を非表示にしているため、問題なく実行できます。

よりスマートなソリューションには、2 番目のスクリプトが送信するシグナル、またはウォッチャー スレッドが送信する何らかのシグナルが含まれます。例えば:

def run_other_script_with_gui_hidden(window):
    gui_library.do_on_main_thread(window.hide)
    subprocess.call([sys.executable, '/path/to/other/script.py'])
    gui_library.do_on_main_thread(window.show)

def handle_button_click(button):
    t = threading.Thread(target=run_other_script_with_gui_hidden)
    t.daemon = True
    t.start()

button.window()、、、などをwindow.hide()gui_library.do_on_main_thread選択したウィンドウ ライブラリの適切なコードに置き換える必要があることは明らかです。

最初のスクリプトを実際に終了させ、2 番目のスクリプトで再起動させたい場合は、それを行うことができますが、注意が必要です。2 番目のスクリプトを子プロセスとして起動するのではなく、兄弟として起動します。理想的には、独自のプロセスを引き継ぐだけです。それを行う前にGUIをシャットダウンする必要があることを除いて、OSが自動的にシャットダウンしない限り(基本的にWindowsはシャットダウンしますが、Unixはシャットダウンしません)。ファミリを見てくださいos.exec。ただし、これらが Unix でどのように機能するかを正しく理解する必要があります。2 つのスクリプトを密結合させたくない場合は、最初のスクリプトを再起動するための正確な引数をコマンド ラインで 2 番目のスクリプトに渡すことをお勧めします (基本的に、sys.argv他のすべてのパラメーターの後にスクリプト全体を渡します)。

別の方法として、 を使用execfileして既存のインタープリター インスタンス内で 2 番目のスクリプトを実行し、2 番目のスクリプトexecfileを元に戻すことができます。execこれには、ソリューションと同様の問題がありますが、同一ではありません。

于 2013-02-27T23:42:04.770 に答える