回答編集履歴
4
コード修正
test
CHANGED
@@ -48,9 +48,9 @@
|
|
48
48
|
|
49
49
|
import ctypes
|
50
50
|
|
51
|
-
kernel32 = ctypes.
|
51
|
+
kernel32 = ctypes.windll.kernel32
|
52
52
|
|
53
|
-
user32 = ctypes.
|
53
|
+
user32 = ctypes.windll.user32
|
54
54
|
|
55
55
|
|
56
56
|
|
3
訂正: プロセスの終了を待つ → スレッドの終了を待つ(スレッド内で別プロセスを起動してるので間違いではないが、コードはThreadPoolなので正確ではない)
test
CHANGED
@@ -146,7 +146,7 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
-
# 外部プロセスの
|
149
|
+
# スレッドプール内で起動している外部プロセスの完了を待つ
|
150
150
|
|
151
151
|
executor.shutdown()
|
152
152
|
|
2
コード変更: executorをローカル変数に移動(main()内で後始末をしていたので、main()内で初期化するように移動)
test
CHANGED
@@ -54,17 +54,9 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
executor = ThreadPoolExecutor(thread_name_prefix="worker")
|
58
57
|
|
59
58
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
def run_program(executor
|
59
|
+
def run_program(executor):
|
64
|
-
|
65
|
-
# py main.py で起動していた場合は、元のコンソールに出力されます
|
66
|
-
|
67
|
-
# pyw main.py で起動していた場合は、新たなコンソールを開きます
|
68
60
|
|
69
61
|
def proc():
|
70
62
|
|
@@ -83,8 +75,6 @@
|
|
83
75
|
future = executor.submit(proc)
|
84
76
|
|
85
77
|
future.add_done_callback(done)
|
86
|
-
|
87
|
-
logging.debug(future)
|
88
78
|
|
89
79
|
|
90
80
|
|
@@ -132,9 +122,15 @@
|
|
132
122
|
|
133
123
|
|
134
124
|
|
125
|
+
executor = ThreadPoolExecutor(thread_name_prefix="worker")
|
126
|
+
|
127
|
+
run_command = partial(run_program, executor)
|
128
|
+
|
129
|
+
|
130
|
+
|
135
131
|
root = tk.Tk()
|
136
132
|
|
137
|
-
button1 = tk.Button(root, text="Run", command=run_
|
133
|
+
button1 = tk.Button(root, text="Run", command=run_command)
|
138
134
|
|
139
135
|
button2 = tk.Button(root, text="Show", command=show_console)
|
140
136
|
|
1
説明補足
test
CHANGED
@@ -5,6 +5,16 @@
|
|
5
5
|
それ以外(ソフトを起動したコンソールの表示・非表示)なら
|
6
6
|
|
7
7
|
プラットフォーム依存のAPIを呼び出す事になります。
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
通常はコンソールの表示・非表示切り替えのようなことはあまりしません。
|
12
|
+
|
13
|
+
メインの処理が単体の独立した実行ファイルで、
|
14
|
+
|
15
|
+
後付けのGUIから呼び出されて一時的にコンソールが表示されるという構成は、
|
16
|
+
|
17
|
+
他でも見かけたことがあります。
|
8
18
|
|
9
19
|
|
10
20
|
|