Python3 Tkinter ボタンを押したら実行中アプリウィンドウを最前面に移動したい
で質問した時のソースコードについて、問題点が後から見つかりました。
実行するとボタンが配置されたTkinterウィンドウが表示されます。
ボタンを押すとIEを開きます。
IEを開いたままTkinterを閉じるとPythonが終了せず、タイムアウトの例外のprint()が表示されます。
一応、threadにdaemon=Trueをつければ強制終了するのですが、
なぜIE開いたままでTkinterを閉じるとPythonが終了しないのでしょうか。
Python
1import subprocess 2import threading 3import tkinter as tk 4 5def on_button(): 6 thread = threading.Thread(target=control_task) 7 thread.start() 8 9def control_task(): 10 ret = check_task() 11 if ret == 1: 12 show_ie_on_the_front() 13 elif ret == 0: 14 open_ie() 15 else: 16 print("command error") # ここに該当する可能性はないと思っている 17 18def check_task(): 19 cmd = 'tasklist /fi "imagename eq iexplore.exe"' 20 outs, errs = mypopen(cmd, 3) 21 # Popenのreturncodeで実行の有無の判別はできない(どちらも正常に実行したら 0)ので出力をチェック 22 if outs: 23 data = outs.split("\n") 24 for i, row in enumerate(data): 25 if "iexplore.exe" in row: 26 return 1 27 return 0 28 return -1 29 30def show_ie_on_the_front(): 31 print("show_ie_on_the_front") 32 33def open_ie(): 34 cmd = "C:\Program Files\Internet Explorer\iexplore.exe" 35 ret = mypopen(cmd, 3) 36 print(ret) 37 38def mypopen(cmd, time): 39 outs = b"" 40 errs = b"" 41 42 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 43 44 try: 45 #proc.wait(timeout=time) 46 outs, errs = proc.communicate(timeout = time) 47 except subprocess.TimeoutExpired as e: 48 print(type(e)) 49 print(e) 50 proc.kill() 51 outs, errs = proc.communicate() 52 53 outs = outs.decode("cp932") 54 errs = errs.decode("cp932") 55 56 return outs, errs 57 58 59if __name__ == "__main__": 60 root = tk.Tk() 61 62 button = tk.Button(root, text="Open", width=10, command=on_button) 63 button.grid() 64 65 root.mainloop()
その時の表示
(例外処理にあるprint()2つはTkinterの閉じるボタンを押して約3秒後ぐらいに表示され、IEを閉じると('', '')が表示された。)
PS C:\Users\ユーザ名> & C:/Users/ユーザ名/AppData/Local/Programs/Python/Python38/python.exe c:/Users/ユーザ名/Desktop/test.py <class 'subprocess.TimeoutExpired'> Command 'C:\Program Files\Internet Explorer\iexplore.exe' timed out after 3 seconds ('', '')
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/06 12:54