GUI作ったこと無いです。よろしくお願いします。
Pythonでメインプログラム実行中に、停止ボタンのついたウインドウを表示させておき、停止ボタンが押されたらプログラムが停止するようにしたいです。
メインのプログラム中に、
subprocess.Popen(['python', 'GUIwindow.py'])
とやっておいて、GUIwindow.pyにtkinterでウインドウを作成するコードを入れて置ければ、メインプロセス実行中にボタンのついたウインドウをう作っておくことはできるみたいなのですが、サブプロセスのボタンが押されたらメインも停止させる方法が分かりません。
サブプロセスのウインドウだけ停止するならボタンの動作に
button3 = tkinter.Button(root, text='Exit', command=sys.exit)
としておけば、消えるのですが、これを押すとメインのプロセスも停止するようにしたいです。どうやれば良いのでしょう?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
python
1import tkinter 2import os, signal 3 4def func1(): 5 label.configure(text='button1 pressed') 6 7root = tkinter.Tk() 8label = tkinter.Label(root, text='press button') 9label.pack() 10button1 = tkinter.Button(root, text='Exit', command=lambda: os.kill(os.getppid(), signal.SIGTERM)) 11 12button1.pack() 13root.mainloop()
コメントのコードを改修しました。
このように、os.kill()をlambda式のなかで実行するようにしましょう。
オリジナルのコードではos.killがボタンを作成する段階で評価されてしまいます。
もっと単純にするなら、スレッドを使ってやる方法もありますよ。スレッドのほうがサブプロセスよりは軽量なのでおすすめですね。
サブプロセスは膨大な計算を並列化するときなど、PythonのGILが邪魔なとき、Python以外のプロセスを動かしたいときの手段です。
python
1import tkinter 2from threading import Thread 3 4def submain(): 5 """本来のメインプロセス動作""" 6 7root = tkinter.Tk() 8label = tkinter.Label(root, text='press button') 9label.pack() 10button1 = tkinter.Button(root, text='Exit', command=root.destroy) 11 12th = Thread(target=submain) 13th.start() 14 15button1.pack() 16root.mainloop()
投稿2018/11/01 23:23
編集2018/11/01 23:36総合スコア322
0
python
1import os, signal 2os.kill(os.getppid(), signal.SIGTERM)
投稿2018/11/01 08:53
総合スコア6142
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
subprocess.Popenではなく、multiprocessingのProcessという命令を使うことで一つのpyファイル内で実現することが出来ました!
もしかするとthreadingでもう少し安全にうまくやる方法もあるのかも知れませんが、今のところ精一杯綺麗に実現した方法ということで。
python
1#coding:utf-8 2from multiprocessing import Process 3from time import sleep 4import tkinter 5import os, signal 6 7 8 9def func1(): 10 root = tkinter.Tk() 11 label = tkinter.Label(root, text='press button') 12 label.pack() 13 button1 = tkinter.Button(root, text='Exit', command=lambda: os.kill(os.getppid(), signal.SIGTERM)) 14 button1.pack() 15 root.mainloop() 16 17 18def main(): 19 i = Process (target=func1) 20 i.start() 21 j=0 22 while True: 23 #メイン処理省略 24 print("target.JPG",j) 25 j+=1 26 sleep(1) 27 28if __name__ == "__main__": 29 main() 30 31 32
投稿2018/11/04 00:37
編集2018/11/04 00:58総合スコア78
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なぜメインの方で全てやらないのかよくわかりませんが、
subprocess.Popen
を行う際にでも、プロセス間通信を行うようにして、その結果を持って終了するようにするとか。
subprocess.Popenではpipeが使えるので、これで起動した時に標準出力にfinishとか出力し、
メイン側ではそのpipeを監視、finishで終了する、など。
投稿2018/11/01 11:31
総合スコア5488
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/01 15:19 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 10:21
2018/11/02 10:31