前提・実現したいこと
現在、Pythonを使い、GUIから複数プログラムの起動・終了を行えるものを開発中です。
そこで**、tkinterを使って起動させた複数の別のプログラム(.pyファイル)を個別に終了させたく、その手段を探しています。**
イメージ的には、個々の起動ボタンと終了ボタンが欲しい。という単純なものです。
全てのプログラムの終了は、sys.exit()を使い実装できました。しかし、個別のプログラムの終了方法が
なかなか見つかりません。
###現状の手段に至った経緯
別のアプローチとして、現状個別の.pyファイルとして分けているものを1つのpyファイルに纏めてはいいのではないか?という考えもあると思います。
しかし、このプログラムの用途上、「ひとつだけ止めて、そのプログラムだけ変数を変えてもう一度動かす」という需要があり、1つにまとめてしまってはそれを実現できないと私は考えています。
また、現状ではtkinterを使っていますが、目的に対し他のGUIライブラリの方が適切であれば、この限りではありません。
こういった目的に使えそうな手段があるかどうか、皆様のお知恵を貸していただけると幸いです。
###tkinterにより起動した各プログラムの概要
・無限ループをしている(プログラム自身に終点は無い)
・scheduleライブラリを使い定時実行している
補足情報(プログラム実行までの手順)
参考に、現状のプログラムを提示いたします。
上で解説した通り、「ボタンを押すと別のプログラムがsubprocess.Popenにより起動する」といったプログラムです。
※当初、「Threading.Threadにより~」と記載していましたが、誤りだったため修正しました。
import sys import tkinter import threading from tkinter.constants import tkinter.ttk from tkinter import ttk import subprocess def button_func_1(event): event.widget.config(fg="red") #ボタンの文字の色の設定 command = ["python",r"D:\python\15m_v03.py", "encoding='utf_8'"] proc = subprocess.Popen(command) print(event.widget.cget("text") + "を実行しました") def button_func_2(event): event.widget.config(fg="red") #ボタンの文字の色の設定 command = ["python",r"D:\python\30m_v03.py", "encoding='utf_8'"] proc = subprocess.Popen(command) print(event.widget.cget("text") + "を実行しました") def button_func_3(event): event.widget.config(fg="red") #ボタンの文字の色の設定 command = ["python",r"D:\python\1h_v03.py", "encoding='utf_8'"] proc = subprocess.Popen(command) print(event.widget.cget("text") + "を実行しました") def button_func_4(event): event.widget.config(fg="red") #ボタンの文字の色の設定 command = ["python",r"D:\python\4h_v03.py", "encoding='utf_8'"] proc = subprocess.Popen(command) print(event.widget.cget("text") + "を実行しました") def finish_menu(): # 終了ボタンをクリックしたときの動作の関数 sys.exit() # 操作画面の定義 root = tkinter.Tk() # このウィンドウの名前 root.title(u"起動メニュー") # タイトルバーの表記(操作メニュー) root.configure(bg="#ed9517") # メインフレームの作成と設置 frame = ttk.Frame(root,padding=5) frame.grid(column=0, row=0, padx=10, pady=10,) # ラベル label1 = tkinter.Label(frame, text='■■■通知システム■■■') label1.grid(row=0, column=0,padx=0,pady=10) # ボタンのインスタンス作成 button_1 = tkinter.Button(frame,text='時間:15分') button_1.grid(row=1, column=0,columnspan=2,padx=0,pady=10) button_2 = tkinter.Button(frame,text='時間:30分') button_2.grid(row=2, column=0,padx=0,pady=10,) button_3 = tkinter.Button(frame,text='時間:1時間') button_3.grid(row=3, column=0,padx=0,pady=10,) button_4 = tkinter.Button(frame,text='時間:4時間') button_4.grid(row=4, column=0,padx=0,pady=10,) # 終了ボタン button_finish = ttk.Button(frame,text='全て終了', command=finish_menu) button_finish.grid(row=5, column=0,padx=0,pady=10,) # ボタンクリック時のイベント設定 button_1.bind("<ButtonPress>", button_func_1) button_2.bind("<ButtonPress>", button_func_2) button_3.bind("<ButtonPress>", button_func_3) button_4.bind("<ButtonPress>", button_func_4) # スレッドの生成と開始 thread_1 = threading.Thread(target=button_func_1) thread_1.start() thread_2 = threading.Thread(target=button_func_2) thread_2.start() thread_3 = threading.Thread(target=button_func_3) thread_3.start() thread_4 = threading.Thread(target=button_func_4) thread_4.start() # メインループ root.mainloop()
###補足情報(FW/ツールのバージョンなど)
python 3.9.2
回答2件
あなたの回答
tips
プレビュー