はじめに
XYテーブル製作シリーズ 第8.5回
はじめに:なぜ Thread を使う必要があるのか
第8回でTkinterのGUIからXYテーブルを操作できるようになりました。しかし、なぜ Thread を使う必要があるのでしょうか? Thread を使わないと、GUIは簡単に固まってしまいます。今回はその理由と、Threadによる解決方法を解説します。
この記事で分かること
- GUIは「イベントループ」で動いていて、それは1つのメインスレッドで回っている
- 時間のかかるモーター処理を同じスレッドで実行するとイベント処理が止まる=GUIが固まる
threading.Threadでモーター処理を別スレッドに逃がすとGUIが止まらない- ThreadからGUIを直接触るとエラーになるので
queue.Queueで通信する(定番パターン)
GUIプログラムの仕組み(イベントループ)
Tkinterなどの GUI はイベントループで動いています。
イベント待ち → ボタンが押された? → 処理実行 → 画面更新 → イベント待ち …この処理は1つのスレッド(GUIメインスレッド)で回っています。
GUIが固まる原因
ボタンを押したときにモーター制御を直接実行するとします。
def start_xy():
run_motor() # forループ → GPIO制御 → time.sleep() を数千回この処理は数秒〜数十秒かかります。しかもGUIメインスレッドで実行されるため、その間イベント処理が止まります。
GUIスレッド → モーター処理(長時間)→ イベント処理停止
→ 画面更新されない・ボタン押せない・ウィンドウ動かない = GUIが固まるThreadで解決する
そこで threading.Thread を使い、モーター処理を別スレッドで実行します。
threading.Thread(
target=run_motor,
args=(...)
).start()すると処理が分かれます。
- GUIスレッド:画面更新・ボタン操作を受け付け続ける
- モータースレッド:裏でGPIO制御・ステップループを回す
結果、GUIは操作可能なまま、モーターは裏で動く状態になります。
XY同時制御にもThreadが必要
XYテーブルでは2軸を同時に動かします。XモーターThread と YモーターThread を作れば、XY同時移動ができます。
Threadの問題:GUIとの通信
Threadには問題もあります。GUIスレッド以外から直接GUIを操作するとエラーになることがあるのです(現在位置表示・エラー表示・完了通知など)。
解決方法:queue.Queue
message_queue = queue.Queue()
# モータースレッド側:メッセージを送るだけ
message_queue.put(("pos", axis, current_mm))
# GUIスレッド側:root.after で定期的に取り出して画面更新モータースレッドは Queue にメッセージを入れるだけ、GUIスレッドが Queue から取り出して画面を更新する——これが Python GUI設計の定番パターンです。実装は第9回で行います。
まとめと次回予告
- GUIはイベントループ(1メインスレッド)で動く
- モーター処理は時間がかかる → 同じスレッドで実行するとGUIが固まる
- Threadを使うとGUIが止まらない
- Thread → GUI の通信には Queue を使う
次回・第9回では、この設計を踏まえて原点復帰GUI・現在位置表示・ソフトリミットを実装し、本格的なXYテーブルコントローラにします。
次に読む記事
🏠 次回はこちら(第9回) XYテーブルGUIに原点復帰・現在位置表示・ソフトリミットを実装|Queueでスレッド安全にGUI更新 Queueパターンを実際に実装する。 → 🖥️ 前回(第8回) PythonのTkinterでXYテーブルをGUI操作する|移動量入力・XY同時実行・緊急停止ボタン GUIの土台になったコード。 → 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。 →よくある質問(FAQ)
Qtime.sleep をやめれば Thread なしでもGUIは固まりませんか?
Atime.sleep 中もループ自体がGUIメインスレッドを占有するので、sleepを短くしても数千回のステップ出力の間GUIは固まります。root.update() を挟む方法もありますが、応答が不安定になりがちで、別スレッド化のほうが素直です。
Qthreading と multiprocessing はどちらを使うべきですか?
AGPIO制御やtime.sleep主体の待ち処理は threading で十分です(GILの影響が小さい)。CPUをフルに使う重い計算を並列化したいときだけ multiprocessing を検討します。XYテーブル制御は threading が定番です。
QThreadからGUIを直接更新したらたまたま動きました。
ATkinterはスレッドセーフではなく、別スレッドからのGUI操作は「動くこともあるが、たまにクラッシュ・フリーズする」不安定な状態です。queue.Queue + root.after でメインスレッドに処理を戻すのが安全です。
Q緊急停止はThreadをどう止めればいいですか?
APythonのスレッドは外部から強制終了できません。グローバルなフラグ(stop_flag = True)を立て、モーターループが毎回それをチェックして return する「協調的キャンセル」を使います。あわせて GPIO.output(EN, HIGH) で電流も切ります。
XYテーブル製作シリーズ(全12回)
- Raspberry Pi ImagerでのOSインストール手順|microSD書き込みから初期設定まで
- ラズパイでLチカ|PythonとRPi.GPIOでLEDを点灯・点滅させる方法
- ラズパイでステッピングモーターを回す方法|A4988の配線とPython制御・Vref調整
- ステッピングモーターをmm単位で動かす計算式とPython実装|step/mmの求め方
- PythonでX軸・Y軸のステッピングモーターを2軸制御する方法|A4988ドライバー2台
- ステッピングモーターの脱調を防ぐ加減速制御(台形駆動)をPythonで実装する方法
- Raspberry PiでXYテーブルを2軸同時制御|Pythonのthreadingでステッピングモーターを同時に動かす
- Raspberry Pi+PythonでXYテーブルの原点復帰(Homing)を実装|リミットスイッチ・バックオフ処理
- PythonのTkinterでXYテーブルをGUI操作する|移動量入力・XY同時実行・緊急停止ボタン
- PythonのGUIが固まる理由とThreadの使い方|Tkinterでモーター制御中もボタンを効かせる(この記事)
- XYテーブルGUIに原点復帰・現在位置表示・ソフトリミットを実装|Queueでスレッド安全にGUI更新
- XYテーブル制御GUIに単軸動作・片道移動・安全なプログラム終了を実装
- 自作XYテーブルの完成構成と設計資料(図面・BOM・結線図)|完成版Pythonコード配布
補足記事
⚡ 第1.5回・補足 A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 モーターを回す前に必ずやる A4988 の電流調整。 → 🔀 番外編 L6470が動かない原因|A4988との違いとSPI通信・デイジーチェーンの罠 高機能ドライバ L6470 を A4988 と同じ感覚で使ってハマった話。 → 🗺️ 全体像 自作XYテーブルの全手順ロードマップ|Raspberry Pi+ステッピングモーターで2軸制御 第0回〜第11回の全工程をまとめたロードマップ。 →Follow me on X
本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕
@ninjin_py_vba をフォローシリーズ記事一覧
電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。
-
FILE.01 — IoT
Raspberry Pi Pico W × GASラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
「外出中のペットの室温が心配…」そんな思いからスタートしたIoT自作プロジェクトの総集編。温湿度監視からエアコン遠隔操作まで、仕組みをゼロから作りたい方のための全5回の開発記録です。
シリーズを読む -
FILE.02 — CNC
Arduino × レーザー刻印CNCCNC自作シリーズ
高精度な加工を目指し、本格的な自作CNC製作に挑戦中。現在は基幹パーツであるオリエンタルモーターの納品を待つ「設計・準備編」を公開。ハードとソフトの両面から、理想のマシンを形にする過程をリアルタイムにお届けします。
シリーズを読む -
FILE.03 — XY軸制御
Raspberry Pi × ステッピングモーターXYテーブルシリーズ
Raspberry Piとステッパモーターを使い、ゼロから2軸制御に挑む記録。OS設定から回路設計、多軸制御のPythonコードまで、躓きやすいポイントを徹底図解。電子工作初心者が「動く感動」を味わうための実戦ガイドです。
シリーズを読む -
FILE.04 — 業務自動化
Python × Excel × CustomTkinter【Python開発記】NINJIN Mail制作記
PythonとExcelを連携させ、実務で即戦力となるメール送信ツールを開発。CustomTkinterによるUI構築や、ミスを防ぐテンプレート活用術など、現場の「痒い所に手が届く」自動化ノウハウを細部まで丁寧に解説します。
シリーズを読む -
FILE.05 — 業務自動化
Python × Excel × GUIアプリ化Invoice Maker(請求書・見積書自動作成)
手作業の請求書作成から卒業!PythonでExcelデータを読み込み一括PDF化する「Invoice_Maker」の作り方を全3回で解説。基本ロジックからGUIアプリ化まで、実務で役立つ自動化ノウハウが満載です。
シリーズを読む

コメント