現在、以下のようなものを作成しています。
Pythonのコードを実行するPythonのアプリと思っていただいて大丈夫です。
- GUIはtkinterで構築する
- 画面上にはテキストボックス x 1とボタン x 2がある
- ボタン①を押した際に、テキストボックス内の文字列を
exec
で実行する(名前空間を渡す都合上、exec
を使用しています)
実装自体は大まかに以下のように完成はしています。
python
1from threading import Thread 2 3class Application: 4 def _build_gui (self: Self) -> None: 5 # GUIはここで構築する 6 # イベントハンドラとかもここで設定 7 8 def _exec (self: Self) -> None: 9 def callback () -> None: 10 self._disable_ui() # UIを操作不能にする('status'を弄るだけです) 11 try: 12 exec(PY_CODE_STR, MY_NAMESPACE) 13 except: 14 # エラー出力などの処理 15 finally: 16 self._enable_ui() # UIを操作可能にする 17 self._thread = Thread(target=callback, daemon=True) 18 self._thread.start()
ただ、実行を中断する機能を追加する必要が出てきました(ボタン②を押した際に実行)。
threading.Thread
は外から中断させるようなものではない(意訳)といった記事も多く、無理やり中断させるのを避けるためにmultiprocessing.Process
の使用を検討しています。
一旦は単純な置き換えとして以下のような形としています。
python
1from multiprocessing import Process 2 3class Application: 4 def _exec (self: Self) -> None: 5 self._process = Process(target=callback) 6 self._process.start() 7 8 def _stop (self: Self) -> None: 9 self._process.terminate() # プロセスキル 10 self._process = None 11 self._enable_ui()
ですが、どうやらprocess_func
内のself._disable_ui()
を実行した際に以下のようなエラーが発生しているようです。
※self._disable_ui()
の削除で動作することを確認しています。
Unknown sequence number while processing queue You called XInitThreads, this is not your fault
質問したい内容としては以下のものとなります。
exec
により実行されている処理を止める手段は何かありませんか?multiprocessing.Process
で実行した処理内でUIの操作を行った際に上記のエラーとなる要因は何か分かりませんか?

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。