回答編集履歴

4

コード修正

2020/09/18 11:41

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -48,9 +48,9 @@
48
48
 
49
49
  import ctypes
50
50
 
51
- kernel32 = ctypes.WinDLL('kernel32')
51
+ kernel32 = ctypes.windll.kernel32
52
52
 
53
- user32 = ctypes.WinDLL('user32')
53
+ user32 = ctypes.windll.user32
54
54
 
55
55
 
56
56
 

3

訂正: プロセスの終了を待つ → スレッドの終了を待つ(スレッド内で別プロセスを起動してるので間違いではないが、コードはThreadPoolなので正確ではない)

2020/09/18 11:41

投稿

teamikl
teamikl

スコア8760

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()内で初期化するように移動)

2020/09/18 08:26

投稿

teamikl
teamikl

スコア8760

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=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_program)
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

説明補足

2020/09/18 08:17

投稿

teamikl
teamikl

スコア8760

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