質問編集履歴
1
コード整備、及びタイトル修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
execを外部から止める手段の有無
|
1
|
+
execを外部から止める手段の有無 + multiprocessing.Processでtk.Button['status']を変更した際に発生するエラー
|
test
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
- GUIはtkinterで構築する
|
5
5
|
- 画面上にはテキストボックス x 1とボタン x 2がある
|
6
|
-
- ボタン①を押した際に、テキストボックス内の文字列を`exec`で実行する
|
6
|
+
- ボタン①を押した際に、テキストボックス内の文字列を`exec`で実行する(名前空間を渡す都合上、`exec`を使用しています)
|
7
7
|
|
8
8
|
実装自体は大まかに以下のように完成はしています。
|
9
9
|
|
@@ -11,20 +11,20 @@
|
|
11
11
|
from threading import Thread
|
12
12
|
|
13
13
|
class Application:
|
14
|
-
def _build_gui (self):
|
14
|
+
def _build_gui (self: Self) -> None:
|
15
15
|
# GUIはここで構築する
|
16
16
|
# イベントハンドラとかもここで設定
|
17
17
|
|
18
|
-
def _exec (self):
|
18
|
+
def _exec (self: Self) -> None:
|
19
|
-
def
|
19
|
+
def callback () -> None:
|
20
20
|
self._disable_ui() # UIを操作不能にする('status'を弄るだけです)
|
21
21
|
try:
|
22
|
-
exec(PY_CODE_STR)
|
22
|
+
exec(PY_CODE_STR, MY_NAMESPACE)
|
23
23
|
except:
|
24
24
|
# エラー出力などの処理
|
25
25
|
finally:
|
26
26
|
self._enable_ui() # UIを操作可能にする
|
27
|
-
self._thread = Thread(target=
|
27
|
+
self._thread = Thread(target=callback, daemon=True)
|
28
28
|
self._thread.start()
|
29
29
|
```
|
30
30
|
|
@@ -36,14 +36,12 @@
|
|
36
36
|
from multiprocessing import Process
|
37
37
|
|
38
38
|
class Application:
|
39
|
-
def _exec (self):
|
39
|
+
def _exec (self: Self) -> None:
|
40
|
-
def process_func ():
|
41
|
-
# 略
|
42
|
-
self._process = Process(target=
|
40
|
+
self._process = Process(target=callback)
|
43
41
|
self._process.start()
|
44
42
|
|
45
|
-
def _stop (self):
|
43
|
+
def _stop (self: Self) -> None:
|
46
|
-
self._process.terminate()
|
44
|
+
self._process.terminate() # プロセスキル
|
47
45
|
self._process = None
|
48
46
|
self._enable_ui()
|
49
47
|
```
|