barcodewatch
Threaded serial line reader for Python with a simple callback API, built for barcode scanners.
シリアル接続のバーコードスキャナーなどから送られてくる行単位のデータを、バックグラウンドスレッドで読み取り続け、完了した1行ごとにコールバックへ渡すライブラリです。GUI(tkinterなど)のメインループを止めずに、スキャンイベントを受け取れます。
from barcodewatch import Scanner
from barcodewatch.presets import TERA_HW0002
def on_scan(data: str) -> None:
print(f"scanned: {data}")
with Scanner("/dev/ttyUSB0", **TERA_HW0002) as scanner:
scanner.on_scan(on_scan)
...
なぜbarcodewatchなのか
バーコードスキャナーはキーボードエミュレーション(HID)モードで使われることが多いですが、業務用スキャナーはシリアル(RS-232/USB-CDC)接続で使うことも珍しくありません。シリアル接続の場合、自分でポートを開いて読み取りループを書く必要があり、GUIと組み合わせようとするとスレッド周りの設計が地味に面倒です。
barcodewatch(本プログラム)では、ポートを開いてバックグラウンドスレッドで読み取りを開始し、区切り文字(CR/LF/CRLF)で区切られた1行が完成するたびに登録済みコールバックを呼び出す、という最小限の仕組みだけを提供します。
現状、行単位のテキストデータ受信のみの機能となっています。バイナリプロトコルの解析やスキャナー側の設定変更(コマンド送信)が本格的に必要な場合は、他のより高機能なライブラリについても検討してください。
インストール
pip install barcodewatch
PyPIで公開しています。
API
Scanner(port, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=1.0)— シリアルポートを開き、即座にバックグラウンドの読み取りスレッドを開始します。portとtimeout以外のデフォルト値はserial.Serial自身のデフォルトと同じで、特定の機種を前提にした値は一切持ちません(timeoutのみ、読み取りスレッドがclose()に素早く反応できるようにするための実装上の都合で1.0にしています。機種の設定ではありません)。barcodewatch.presets— 特定機種向けの設定をまとめたモジュール。現状TERA_HW0002(元記事の想定機種)のみですが、他機種を使う場合は同じ形のdictを自分で定義してScanner(port, **your_preset)のように渡せます。Scanner自体は特定機種を一切知りません。scanner.on_scan(callback)—callback(data: str)を登録します。CR/LF/CRLFで区切られた行が完成するたびに呼び出されます。何個でも登録可能で、どのスレッドから呼んでも安全です。scanner.send(data)— 生のバイト列をシリアルポートに書き込みます。scanner.running— 読み取りスレッドが停止するとFalseになります(close()後、またはデバイスが切断された場合など)。scanner.close()— スレッドを停止し、ポートを閉じます。何度呼んでも安全です(with Scanner(...) as scanner:を使えば自動的に呼ばれます)。
tkinterと組み合わせた一通りの使用例はexamples/tkinter_gui.pyを参照してください。
動作検証
検証環境(2026-08-23)
| 項目 | 内容 |
|---|---|
| OS | Windows 11 Pro |
| Python | 3.10.6(プロジェクト専用のvenv) |
| インストール方法 | pip install -e . |
| 依存パッケージ | pyserial 3.5 |
| バーコードリーダー | Tera HW0002(USB接続、USB-SERIAL CH340として認識、COM5) |
確認できたこと
Scanner("COM5", **TERA_HW0002)でポートを開き、実機でバーコードを連続スキャンしてon_scanコールバックに値が正しく渡ることを確認。examples/tkinter_gui.pyを実行し、tkinterウィンドウの「Scan Data:」欄にスキャンごとの値が正しく反映されることを確認。
未検証
- Linux / macOSでの動作(pyserial自体はクロスプラットフォームのため動作するはずだが、実機未確認)
ライセンス
MIT — LICENSEを参照してください。
背景
このライブラリは、Qiitaに投稿した元のプログラムを土台に、バグ修正・API整理・パッケージ化を行って作られています。
実装のコーディングやレビュー、設計の壁打ち相手としてClaude Codeを使用しました。
Metadata
Release files for barcodewatch 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| barcodewatch-0.1.0.tar.gz | 9.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| barcodewatch-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.5 kB
Release files / barcodewatch-0.1.0.tar.gz
| Download URL | barcodewatch-0.1.0.tar.gz |
|---|---|
| Size | 9.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d01f7a5252fe881445933413b1a2dca5dfd14d852519f4febf2b7753c42dd8f0
|
|
BLAKE2b-256 checksum How to use checksums |
5e5ed71aa6fab1629f333311794b1b367882cef48f119e27433f7fb31111a848
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.6
|
Release files / barcodewatch-0.1.0-py3-none-any.whl
| Download URL | barcodewatch-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8dca2977af3620f4836fc1a29dd46c4a4313cf12f800bc5a9a51c22c14f943e8
|
|
BLAKE2b-256 checksum How to use checksums |
5438e68d2864b01caf7297a7a06cb22edde08d086f77dbe7705a644edd5ba30e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.6
|