質問編集履歴

1

コード整備、及びタイトル修正

2025/05/08 13:16

投稿

Refrain
Refrain

スコア682

test CHANGED
@@ -1 +1 @@
1
- execを外部から止める手段の有無/multiprocessingでtkinter['status']を変更した際にエラーが発生する
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 thread_func ():
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=thread_func, daemon=True)
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=process_func)
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
  ```