質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

47閲覧

execを外部から止める手段の有無 + multiprocessing.Processでtk.Button['status']を変更した際に発生するエラー

Refrain

総合スコア673

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2025/05/08 12:04

編集2025/05/08 13:16

現在、以下のようなものを作成しています。
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の操作を行った際に上記のエラーとなる要因は何か分かりませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

multiprocessing.Queueの存在を見落としていました…
__init__内でmp.Queueのインスタンスを抱えさせて、
同時にself._check_queueをループさせてキューの監視をします。
_exec_proc内でmp.Processのインスタンスを作成するとき、
引数にargs=(self._queue,)を渡しておきます。
callback側でqueue.putを呼んでデータを突っ込んで、
キューの監視結果に基づいてGUIの更新をすれば良さそう?です。

tkinterはシングルスレッドであるが故に、
マルチスレッド側からは弄られないみたいな情報がありました。

投稿2025/05/08 15:51

Refrain

総合スコア673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問